【问题标题】:.NET List<T> Concat vs AddRange.NET List<T> Concat vs AddRange
【发布时间】:2010-09-11 03:23:27
【问题描述】:

泛型 List 上的 AddRangeConcat 函数有什么区别?一个比另一个推荐吗?

【问题讨论】:

    标签: .net linq list extension-methods


    【解决方案1】:

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

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

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

    选择具有您想要的语义的任何一个。

    【讨论】:

    • 所以离子紧密循环,使用添加范围会更好,以免由于所有内部更新和撞击GC而损失性能?
    • 实际上,由于延迟执行,使用 Concat 可能会更快,因为它避免对象分配 - Concat 不复制任何内容,它只是在列表之间创建链接,所以当枚举并到达一个结尾,它会透明地将您带到下一个的开头!
    【解决方案2】:

    最大的区别在于AddRange 改变了调用它的列表,而Concat 创建了一个新列表。因此它们有不同的用途。

    另外,Concat 是一种扩展方法,适用于任何 IEnumerable&lt;T&gt; 并返回一个 IEnumerable&lt;T&gt;,您需要一个 .ToList() 来生成一个新列表。

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

    如果您要从两个 IEnumerable&lt;T&gt; 源创建新列表,请使用 Concat.ToList。这具有不会改变任何一个来源的质量。

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

    【讨论】:

    • +1,确实,如果你忘记 'tolist',concat 会默默地什么都不做
    【解决方案3】:

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

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

    这里是Link

    希望这会有所帮助,

    【讨论】:

    • 我做了一个测试,比较了 ConcatAddRangeList&lt;KeyValuePair&lt;string, string&gt;&gt; 的 1000 个元素,连接/添加 100 次,AddRange 的速度非常快。结果如下:AddRange 13 毫秒,Concat().ToList() 16,000 毫秒,ConcatIEnumerable 上仅在最后执行ToList:2,700 毫秒。
    猜你喜欢
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 2011-08-17
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多