C# 什么';将一项添加到IEnumerable的最佳方式<;T>;?
下面是我将如何向IEnumerable对象添加一项:C# 什么';将一项添加到IEnumerable的最佳方式<;T>;?,c#,extension-methods,ienumerable,C#,Extension Methods,Ienumerable,下面是我将如何向IEnumerable对象添加一项: //Some IEnumerable<T> object IEnumerable<string> arr = new string[] { "ABC", "DEF", "GHI" }; //Add one item arr = arr.Concat(new string[] { "JKL" }); //某个IEnumerable对象 IEnumerable arr=新字符串[]{“ABC”、“DEF”、“GHI”}
//Some IEnumerable<T> object
IEnumerable<string> arr = new string[] { "ABC", "DEF", "GHI" };
//Add one item
arr = arr.Concat(new string[] { "JKL" });
//某个IEnumerable对象
IEnumerable arr=新字符串[]{“ABC”、“DEF”、“GHI”};
//添加一项
arr=arr.Concat(新字符串[]{“JKL”});
这很尴尬。但是,我没有看到像ConcatSingle()
这样的方法
是否有更简洁的方法将单个项添加到IEnumerable对象?
IEnumerable
是不可变的集合,这意味着您无法添加或删除项。相反,您必须为此创建一个新集合,只需转换为列表即可添加:
var newCollection = arr.ToList();
newCollection.Add("JKL"); //is your new collection with the item added
编写扩展方法
ConcatSingle
:)
如您所见,原始枚举(我们保存在原始中)没有更改。由于是只读的,您需要转换为列表
var new_one = arr.ToList().Add("JKL");
或者你可以得到一个喜欢的
公共静态IEnumerable追加(此IEnumerable源,参数T[]项)
{
返回来源:Concat(项目);
}
不,这与您使用内置语言/框架功能所获得的简洁性差不多
如果愿意,您可以始终创建扩展方法:
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);
}
}
arr=arr.Append(“JKL”);
//或
arr=arr.Append(“123”、“456”);
//或
arr=arr.Append(“MNO”、“PQR”、“STU”、“VWY”、“etc”和“…”);
// ...
公共静态类EnumerableExtensions
{
公共静态IEnumerable追加(
此IEnumerable源,参数T[]尾)
{
返回源Concat(tail);
}
}
您正在将数组分配给IEnumerable。为什么不使用数组类型而不是IEnumerable
否则,如果要更改集合,可以使用IList(或List)
我只在需要读取方法参数时使用IEnumerable,在需要更改其中的项时使用IList(或List)。Append()
-正是您需要的,它已添加到.NET标准中(2017年),因此您不再需要编写自己的扩展方法。您可以简单地执行以下操作:
arr=arr.Append(“JKL”)代码>
由于.NET是开源的,因此您可以在这里查看实现(它比上面建议的自定义方法更复杂):
@Chris:我把那卷卷回去了。此功能已从SO中删除是有原因的。未意识到此功能已添加。感谢您的更正。IEnumerable
是只读的。这并不意味着它是一成不变的。不可变的集合是一个永远不会改变的集合。IEnumerable
甚至不能保证引用不能被类型转换为可变类型,更不用说基础集合不会改变。也许我遗漏了什么……但是Add不会返回新列表……Add
不会返回新列表,但是因为list
是一个可变集合,您可以简单地引用list
对象来访问“新列表”。从这个意义上说,这个答案有点迂腐(因为最明显的是OP是在问如何从另一个IEnumerable
和一个附加对象创建一个新的IEnumerable
。>IEnumerable
是不可变的集合——这是错误的,它不是集合,而是接口。实现它的类的对象可能是不可变的(如数组)或可变的(如列表),这取决于实现。System中有这样的方法。Linq Namespace非常有趣,谢谢。新的.Net版本似乎正在将链表附加到给定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);
}
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);
}
}