1. ホーム
  2. c#

[解決済み] IEnumerable<T> として単一の項目を渡す

2022-03-24 08:28:20

質問

タイプの単一の項目を渡す一般的な方法はありますか? T を期待するメソッドに IEnumerable<T> パラメータは?言語はC#、フレームワークのバージョンは2.0です。

現在、私はヘルパーメソッドを使用していますが(.Net 2.0なので、LINQに似たキャスト/投影ヘルパーメソッドが一杯あります)、これはただバカバカしいと思うだけです。

public static class IEnumerableExt
{
    // usage: IEnumerableExt.FromSingleItem(someObject);
    public static IEnumerable<T> FromSingleItem<T>(T item)
    {
        yield return item; 
    }
}

その他の方法としては、もちろん List<T> または Array の代わりにそれを渡します。 IEnumerable<T> .

[編集]をクリックします。 拡張メソッドとして、名前がつくかもしれません。

public static class IEnumerableExt
{
    // usage: someObject.SingleItemAsEnumerable();
    public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
    {
        yield return item; 
    }
}

何か見逃していませんか?

[編集2] 私たちは someObject.Yield() (@Peter が下のコメントで提案したように) が、主に簡潔さのために、この拡張メソッドに最適な名前でしたので、誰かがそれを取得したい場合は、ここに XML のコメントと一緒にあります。

public static class IEnumerableExt
{
    /// <summary>
    /// Wraps this object instance into an IEnumerable&lt;T&gt;
    /// consisting of a single item.
    /// </summary>
    /// <typeparam name="T"> Type of the object. </typeparam>
    /// <param name="item"> The instance that will be wrapped. </param>
    /// <returns> An IEnumerable&lt;T&gt; consisting of a single item. </returns>
    public static IEnumerable<T> Yield<T>(this T item)
    {
        yield return item;
    }
}

解決方法は?

あなたのヘルパーメソッドは、最もクリーンな方法だと思います。リストや配列を渡すと、不謹慎なコードがそれをキャストして中身を変えてしまい、状況によってはおかしな挙動になる可能性があります。読み取り専用のコレクションを使うこともできますが、その場合、さらに多くのラッピングが必要になるでしょう。しかし、この解決策は、とても良い方法だと思います。