是否有一种常见的方法将单个类型的项目传递给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;
}
}
当然,其他方法是创建并填充a List<T>
或an Array
并将其传递给而不是IEnumerable<T>
。
[编辑]作为扩展方法,它可以命名为:
public static class IEnumerableExt
{
// usage: someObject.SingleItemAsEnumerable();
public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
{
yield return item;
}
}
我在这里想念什么吗?
[Edit2]我们发现someObject.Yield()
(如@Peter在下面的评论中所建议的)是此扩展方法的最佳名称,主要是为了简洁起见,因此,如果有人想要抓住它,它与XML注释一起使用:
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
就好了)。顺便说一句,此功能是monad列表的monadic单位IEnumerable<T>
,并且鉴于Microsoft的monad love-fest,我很惊讶这样的事情最初不在框架中。