将单个项目传递为IEnumerable <T>
是否有一种常用的方法将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;
}
}
国际海事组织,你的帮手方法是最干净的方式。 如果你传递一个列表或一个数组,那么不择手段的代码就可以投射它并改变内容,在某些情况下会导致奇怪的行为。 你可以使用只读集合,但这可能涉及更多的包装。 我认为你的解决方案就像它一样整洁。
那么,如果方法需要一个IEnumerable
那么你必须传递一个列表,即使它只包含一个元素。
通过
new T[] { item }
因为我认为这个论据应该足够了
在C#3.0中,您可以使用System.Linq.Enumerable类:
// using System.Linq
Enumerable.Repeat(item, 1);
这将创建一个仅包含您的项目的新IEnumerable。
链接地址: http://www.djcxy.com/p/61137.html上一篇: Passing a single item as IEnumerable<T>
下一篇: Exposing the indexer / default property via COM Interop