小编典典

将单个项目作为 IEnumerable 传递

all

是否有一种通用方法可以将单个类型的项目传递给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; 
    }
}

其他方式当然是创建和填充 aList<T>或 anArray并传递它而不是IEnumerable<T>.

[编辑] 作为扩展方法,它可能被命名为:

public static class IEnumerableExt
{
    // usage: someObject.SingleItemAsEnumerable();
    public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
    {
        yield return item; 
    }
}

我在这里错过了什么吗?

[Edit2] 我们发现someObject.Yield()(正如@Peter
在下面的评论中建议的那样)是这个扩展方法的最佳名称,主要是为了简洁,所以如果有人想抓住它,这里和 XML 评论一起:

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;
    }
}

阅读 118

收藏
2022-03-21

共1个答案

小编典典

IMO,您的辅助方法是最干净的方法。如果您传入一个列表或数组,那么一段不道德的代码可能会对其进行强制转换并更改其内容,从而在某些情况下导致奇怪的行为。您可以使用只读集合,但这可能涉及更多的包装。我认为您的解决方案非常简洁。

2022-03-21