是否有一种通用方法可以将单个类型的项目传递给T需要 IEnumerable<T>参数的方法?语言为 C#,框架版本 2.0。
T
IEnumerable<T>
目前我正在使用一个辅助方法(它是 .Net 2.0,所以我有一大堆类似于 LINQ 的投射/投影辅助方法),但这看起来很愚蠢:
public static class IEnumerableExt { // usage: IEnumerableExt.FromSingleItem(someObject); public static IEnumerable<T> FromSingleItem<T>(T item) { yield return item; } }
其他方式当然是创建和填充 aList<T>或 anArray并传递它而不是IEnumerable<T>.
List<T>
Array
[编辑] 作为扩展方法,它可能被命名为:
public static class IEnumerableExt { // usage: someObject.SingleItemAsEnumerable(); public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item) { yield return item; } }
我在这里错过了什么吗?
[Edit2] 我们发现someObject.Yield()(正如@Peter 在下面的评论中建议的那样)是这个扩展方法的最佳名称,主要是为了简洁,所以如果有人想抓住它,这里和 XML 评论一起:
someObject.Yield()
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; } }
IMO,您的辅助方法是最干净的方法。如果您传入一个列表或数组,那么一段不道德的代码可能会对其进行强制转换并更改其内容,从而在某些情况下导致奇怪的行为。您可以使用只读集合,但这可能涉及更多的包装。我认为您的解决方案非常简洁。