.NET List <T> Concat与AddRange


Answers:


122

它们具有完全不同的语义。

AddRange通过向列表添加其他项来修改列表。

Concat返回一个包含列表和其他项的新序列,而无需修改列表。

选择具有所需语义的任何一个。


1
因此,如果出现一个紧密的循环,最好使用加范围,以免由于内部的所有更新和冲击而损失性能?
约翰·约翰逊

43
实际上,由于推迟执行,使用Concat可能会更快,因为它避免了对象分配-Concat不复制任何内容,它只是在列表之间创建链接,因此在枚举时到达列表的末尾,它会透明地将您带到开始下一个!
格雷格·比奇

36

最大的区别是AddRange会对其进行调用的列表进行变异,而Concat会创建一个新的List。因此它们有不同的用途。

另外,Concat是一种扩展方法,适用于任何IEnumerable并返回IEnumerable,您需要一个.ToList()来生成一个新的List。

如果要扩展现有列表的内容,请使用AddRange。

如果要从两个IEnumerable来源创建新列表,则将Concat与.ToList一起使用。这具有不改变任何一个来源的质量。

如果您只需要枚举两个列表(或任何其他IEnumerable)的内容,则每次都只需使用Concat,这样做的好处是实际上没有分配新的内存来保存统一列表。


3
+1,的确,如果您忘记了“ tolist”,concat会默默地执行任何操作
傻笑者

7

我发现这篇有趣的文章讨论了这两种结构之间的区别并比较了它们的性能...

主要思想是,在添加大尺寸集合时,AddRange的速度要快得多。

这是链接

希望这可以帮助,


1
我已经进行了比较,ConcatAddRangeList<KeyValuePair<string, string>>具有1000个元素的测试相连接/相加/添加了100次,并且测试AddRange速度非常快。结果是这些:AddRange13毫秒,Concat().ToList()16000毫秒,和ConcatIEnumerable做的只是ToList在最后:2700毫秒。
安德鲁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.