目前我正在使用一个帮助方法(它是 .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<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;
}
}
if (item == null) yield break;
。这样你就不能传递空值并且也能利用(平凡的)null对象模式来处理
IEnumerable
。(foreach (var x in xs)
能够很好地处理空的xs
)。顺便说一下,这个函数是列表单子类型
IEnumerable<T>
的单子单位,并且鉴于Microsoft对单子的热爱之情,我很惊讶像这样的东西在框架中竟然没有出现。 - Matt EnrightT
实现IEnumerable
时,例如string
。) - Jon-Ericleft==null
检查。它破坏了代码的美感并阻止了代码变得更加灵活——如果某天您需要生成一个可以为空的单例,该怎么办? 我的意思是,new T[] { null }
不同于new T[] {}
,有一天您可能需要区分它们。 - Earth Engine