.NET List <T> Concat与AddRange

joh*_*hnc 85 .net linq extension-methods list

通用List上的AddRangeConcat函数有什么区别?一个推荐超过另一个?

Gre*_*ech 113

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

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

Concat返回包含列表和其他项的新序列,而不修改列表.

选择具有您想要的语义的那个.

  • 实际上,由于延迟执行,使用Concat可能会更快,因为它*避免*对象分配 - Concat不复制任何东西,它只是在列表之间创建链接所以当枚举并且你到达它的末尾它透明地带你到下一个开始! (39认同)
  • 因此,在一个紧密的循环中,最好使用添加范围,以免由于所有内部更新和对 GC 的冲击而损失性能? (2认同)

Ant*_*nes 32

最大的区别是AddRange会改变调用它的列表,而Concat会创建一个新的List.因此它们有不同的用途.

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

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

如果要从两个IEnumerable源创建新列表,请将Concat与.ToList一起使用.它的质量不会改变任何一种来源.

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

  • +1,的确,如果您忘记了“加入”,concat会无声无息 (2认同)

Hai*_*OUI 5

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

其主要思想是,AddRange在处理大型集合时要快得多。

这是链接

希望这可以帮助,

  • 我做了一个测试,将 `Concat` 和 `AddRange` 与包含 1000 个元素的 `List&lt;KeyValuePair&lt;string, string&gt;&gt;` 进行比较,连接/添加 100 次,并且 `AddRange` 速度非常快。结果如下:“AddRange” 13 毫秒,“Concat().ToList()” 16,000 毫秒,“IEnumerable” 上的“Concat” 最后仅执行“ToList”:2,700 毫秒。 (5认同)