有没有一种常见的方法来将类型为T
的单个项传递给需要IEnumerable<T>
参数的方法?语言是C#,框架版本2.0。
目前我使用的是一个辅助方法(它是LINQ2.0,所以我有一大堆类似于.Net的造型/投影辅助方法),但这看起来很愚蠢:
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;
}
}
我是不是漏掉了什么?
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;
}
}
发布于 2009-10-16 12:49:06
你的helper方法是最干净的方式,IMO。如果您传入一个列表或数组,那么一段不择手段的代码可能会强制转换它并更改内容,从而在某些情况下导致奇怪的行为。您可以使用只读集合,但这可能涉及更多的包装。我认为你的解决方案是最简洁的。
发布于 2009-10-16 12:45:20
好吧,如果这个方法需要一个IEnumerable
,那么你必须传递一个列表,即使它只包含一个元素。
传球
new[] { item }
因为争论应该足够了,我想
发布于 2009-12-23 03:36:25
在C# 3.0中,您可以使用System.Linq.Enumerable类:
// using System.Linq
Enumerable.Repeat(item, 1);
这将创建一个仅包含您的项目的新IEnumerable。
https://stackoverflow.com/questions/1577822
复制相似问题