将单个项目做为IEnumerable传递

是否存在将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&lt;T&gt;
    /// 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&lt;T&gt; consisting of a single item. </returns>
    public static IEnumerable<T> Yield<T>(this T item)
    {
        yield return item;
    }
}

#1楼

好吧,若是该方法指望一个IEnumerable ,则即便它仅包含一个元素,您也必须传递做为列表的内容。 it

经过 io

new T[] { item }

由于我认为论点应该足够 class


#2楼

我想说的最简单的方法是new T[]{item}; ; 没有语法能够作到这一点。 我能想到的最接近的等效项是params关键字,可是固然,这要求您有权访问方法定义,而且只能与数组一块儿使用。 扩展


#3楼

IMO是您的助手方法,是最干净的方法。 若是传递列表或数组,那么不道德的代码段可能会强制转换它并更改内容,从而在某些状况下致使异常行为。 您可使用只读集合,但这可能涉及更多包装。 我认为您的解决方案很是简洁。


#4楼

在C#3(我知道您说过2)中,您能够编写一个通用扩展方法,该方法可能会使语法更容易接受:

static class IEnumerableExtensions
{
    public static IEnumerable<T> ToEnumerable<T>(this T item)
    {
        yield return item;
    }
}

而后,客户端代码为item.ToEnumerable()


#5楼

我很惊讶没有人建议使用类型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);
相关文章
相关标签/搜索