32

以下是我将一项添加到 IEnumerable 对象的方法:

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

//Add one item
arr = arr.Concat(new string[] { "JKL" });

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

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

4

6 回答 6

22

不,这与使用内置语言/框架功能一样简洁。

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

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);
    }
}
于 2013-03-06T15:23:56.553 回答
9

IEnumerable不可变的集合,这意味着您不能添加或删除项目。相反,您必须为此创建一个新集合,只需转换为列表即可添加:

var newCollection = arr.ToList();
newCollection.Add("JKL"); //is your new collection with the item added
于 2013-03-06T15:22:42.757 回答
7

写一个扩展方法ConcatSingle:)

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

但是你需要更加小心你的术语。
您不能将项目添加到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

如您所见,我们保存的原始枚举original没有改变。

于 2013-03-06T15:22:58.160 回答
7

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

var new_one = arr.ToList().Add("JKL");

或者你可以得到一个扩展方法,比如;

public static IEnumerable<T> Append<T>(this IEnumerable<T> source, params T[] item)
{
    return source.Concat(item);
}
于 2013-03-06T15:23:53.210 回答
3

Append()- 正是您所需要的,它已被添加到 .NET Standard(2017 年)中,因此您不再需要编写自己的扩展方法。你可以简单地这样做:

arr = arr.Append("JKL");

由于 .NET 是开源的,因此您可以在这里查看实现(它比上面建议的自定义方法更复杂): https ://github.com/dotnet/runtime/blob/master/src/libraries/System.Linq/ src/System/Linq/AppendPrepend.cs

于 2020-06-12T22:52:45.223 回答
2

您正在将一个数组分配给一个 IEnumerable。为什么不使用 Array 类型而不是 IEnumerable?

否则,如果要更改集合,可以使用 IList(或 List)。

当我需要阅读时,我仅将 IEnumerable 用于方法参数,而当我需要更改其中的项目时,我将使用 IList(或列表)。

于 2013-03-06T15:48:46.350 回答