パラメータ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が示唆しているように)この拡張メソッドの主な名前は簡潔にするために最適な名前であることがわかりました。
public static class IEnumerableExt
{
/// <summary>
/// Wraps this object instance into an IEnumerable<T>
/// 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<T> consisting of a single item. </returns>
public static IEnumerable<T> Yield<T>(this T item)
{
yield return item;
}
}
Yield
ませんか?簡潔さには勝るものはありません。
left==null
ここで小切手嫌いです。それはコードの美しさを壊し、コードがより柔軟になるのを止めます-ある日、nullになる可能性のあるものでシングルトンを生成する必要があると判明した場合はどうでしょうか?new T[] { null }
つまり、と同じではありませんnew T[] {}
。いつかは区別する必要があるかもしれません。
if (item == null) yield break;
ます。これで、nullを渡すことや、の(ささいな)nullオブジェクトパターンを利用することができなくなりましたIEnumerable
。(foreach (var x in xs)
空xs
をうまく処理します)。ちなみに、この関数はリストモナドのモナド単位です。つまりIEnumerable<T>
、Microsoftでのモナド愛祭を考えると、このようなものがそもそもフレームワークにないことに驚いています。