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)
IEnumerable是不可变的集合,它意味着你无法添加或删除项目.相反,您必须为此创建一个新集合,只需转换为要添加的列表:
var newCollection = arr.ToList();
newCollection.Add("JKL"); //is your new collection with the item added
Run Code Online (Sandbox Code Playgroud)
写一个扩展方法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没有改变.
由于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)