以下是我将如何向IEnumerable对象添加一个项目:
//Some IEnumerable<T> object
IEnumerable<string> arr = new string[] { "ABC", "DEF", "GHI" };
//Add one item
arr = arr.Concat(new string[] { "JKL" });
这很尴尬。我没有看到类似ConcatSingle()
之类的方法。
是否有更简洁的方法将单个项添加到IEnumerable对象?
答案 0 :(得分:16)
不,这与您使用内置语言/框架功能一样简洁。
如果您愿意,可以随时创建扩展方法:
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);
}
}
答案 1 :(得分:8)
IEnumerable
是不可变的集合,这意味着您无法添加或删除项目。相反,您必须为此创建一个新集合,只需转换为要添加的列表:
var newCollection = arr.ToList();
newCollection.Add("JKL"); //is your new collection with the item added
答案 2 :(得分: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
中保存的原始枚举没有改变。
答案 3 :(得分:6)
由于IEnumerable
是只读的,因此您需要转换为列表。
var new_one = arr.ToList().Add("JKL");
或者您可以获得 extension method 之类的;
public static IEnumerable<T> Append<T>(this IEnumerable<T> source, params T[] item)
{
return source.Concat(item);
}
答案 4 :(得分: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
答案 5 :(得分:2)
您正在为IEnumerable分配一个数组。为什么不使用Array类型而不是IEnumerable?
否则,如果要更改集合,可以使用IList(或List)。
当我需要读取时,IEnumerable仅用于方法params,当我需要更改其中的项目时,我使用IList(或List)。