是否存在将T
类型的单个项目传递给须要IEnumerable<T>
参数的方法的通用方法? 语言是C#,框架版本2.0。 数组
当前,我正在使用一个辅助方法(它是.Net 2.0,因此我有一堆相似于LINQ的强制转换/投影辅助方法),但这彷佛很愚蠢: app
public static class IEnumerableExt { // usage: IEnumerableExt.FromSingleItem(someObject); public static IEnumerable<T> FromSingleItem<T>(T item) { yield return item; } }
固然,其余方法是建立并填充List<T>
或Array
并传递它,而不是IEnumerable<T>
。 框架
[编辑]做为扩展方法,它能够命名为: this
public static class IEnumerableExt { // usage: someObject.SingleItemAsEnumerable(); public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item) { yield return item; } }
我在这里想念什么吗? spa
[Edit2]咱们发现someObject.Yield()
(如@Peter在下面的注释中建议的)是此扩展方法的最佳名称,主要是为了简洁起见,所以,若是有人想抓住它,它与XML注释一块儿使用: code
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
,则即便它仅包含一个元素,您也必须传递做为列表的内容。 it
经过 io
new T[] { item }
由于我认为论点应该足够 class
我想说的最简单的方法是new T[]{item};
; 没有语法能够作到这一点。 我能想到的最接近的等效项是params
关键字,可是固然,这要求您有权访问方法定义,而且只能与数组一块儿使用。 扩展
IMO是您的助手方法,是最干净的方法。 若是传递列表或数组,那么不道德的代码段可能会强制转换它并更改内容,从而在某些状况下致使异常行为。 您可使用只读集合,但这可能涉及更多包装。 我认为您的解决方案很是简洁。
在C#3(我知道您说过2)中,您能够编写一个通用扩展方法,该方法可能会使语法更容易接受:
static class IEnumerableExtensions { public static IEnumerable<T> ToEnumerable<T>(this T item) { yield return item; } }
而后,客户端代码为item.ToEnumerable()
。
我很惊讶没有人建议使用类型T的参数来简化客户端API的方法的新重载。
public void DoSomething<T>(IEnumerable<T> list) { // Do Something } public void DoSomething<T>(T item) { DoSomething(new T[] { item }); }
如今,您的客户代码能够作到这一点:
MyItem item = new MyItem(); Obj.DoSomething(item);
或列出:
List<MyItem> itemList = new List<MyItem>(); Obj.DoSomething(itemList);