将单个项目传递为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&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;
    }
}

国际海事组织,你的帮手方法是最干净的方式。 如果你传递一个列表或一个数组,那么不择手段的代码就可以投射它并改变内容,在某些情况下会导致奇怪的行为。 你可以使用只读集合,但这可能涉及更多的包装。 我认为你的解决方案就像它一样整洁。


那么,如果方法需要一个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