将一个项添加到IEnumerable <T>的最佳方法是什么?

use*_*861 26 c# ienumerable extension-methods

这是我如何将一个项添加到IEnumerable对象:

//Some IEnumerable<T> object
IEnumerable<string> arr = new string[] { "ABC", "DEF", "GHI" };

//Add one item
arr = arr.Concat(new string[] { "JKL" });
Run Code Online (Sandbox Code Playgroud)

这很尴尬.但是,我没有看到类似的方法ConcatSingle().

有没有更简洁的方法将单个项添加到IEnumerable对象?

Luk*_*keH 17

不,这就像你将使用内置的语言/框架功能一样简洁.

如果您愿意,可以随时创建扩展方法:

arr = arr.Append("JKL");
// or
arr = arr.Append("123", "456");
// or
arr = arr.Append("MNO", "PQR", "STU", "VWY", "etc", "...");

// ...

public static class EnumerableExtensions
{
    public static IEnumerable<T> Append<T>(
        this IEnumerable<T> source, params T[] tail)
    {
        return source.Concat(tail);
    }
}
Run Code Online (Sandbox Code Playgroud)


cuo*_*gle 8

IEnumerable不可变的集合,它意味着你无法添加或删除项目.相反,您必须为此创建一个新集合,只需转换为要添加的列表:

var newCollection = arr.ToList();
newCollection.Add("JKL"); //is your new collection with the item added
Run Code Online (Sandbox Code Playgroud)

  • 你没有遗漏任何东西.这段代码错了. (5认同)

Dan*_*rth 7

写一个扩展方法ConcatSingle:)

public static IEnumerable<T> ConcatSingle<T>(this IEnumerable<T> source, T item)
{
    return source.Concat(new [] { item } );
}
Run Code Online (Sandbox Code Playgroud)

但是你需要更加小心你的术语.
您无法将项目添加到IEnumerable<T>.Concat创建一个新实例.

例:

var items = Enumerable.Range<int>(1, 10)
Console.WriteLine(items.Count()); // 10
var original= items;
items = items.ConcatSingle(11);
Console.WriteLine(original.Count());   // 10
Console.WriteLine(items.Count()); // 11
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我们保存的原始枚举original没有改变.


Son*_*nül 6

由于IEnumerable是只读的,您需要转换为列表.

var new_one = arr.ToList().Add("JKL");
Run Code Online (Sandbox Code Playgroud)

或者您可以获得类似的扩展方法 ;

public static IEnumerable<T> Append<T>(this IEnumerable<T> source, params T[] item)
{
    return source.Concat(item);
}
Run Code Online (Sandbox Code Playgroud)