一尘不染

将单个项目作为IEnumerable传递

c#

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

当然,其他方法是创建并填充a List<T>或an Array并将其传递给而不是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;
    }
}

阅读 289

收藏
2020-05-19

共1个答案

一尘不染

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

2020-05-19