List.AddRange添加数组与列表的性能

时间:2014-07-10 14:13:26

标签: c# arrays list ienumerable

使用List.AddRange()时,添加ListArray之间的效果是否存在差异。

MyList.AddRange(MyArrayof1000ComplexElements);

VS

MyList.AddRange(MyListof1000ComplexElements);

或没有区别?

4 个答案:

答案 0 :(得分:3)

由于数组和列表都实现ICollection<T>,因此它使用相同的代码。 它解析为对Array.Copy(...)的调用

http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs#e569d850a66a1771#references

答案 1 :(得分:1)

List<T>T[]之间没有区别 - AddRange对实施ICollection<T>的任何内容使用相同的处理方式,这两方面都有。

答案 2 :(得分:1)

Array和List都实现了ICollection<T>接口。因此,所使用的List.AddRange的实现将是相同的,并且将提供相同的性能。

将来,您可以使用Stopwatch类通过一个简单的程序自行测试,或者下载JetBrain的dotPeek等工具来自行检查框架代码。

答案 3 :(得分:-1)

这是一个比一些评论可能暗示的更有趣的问题。

碰巧,对于这个特定的列表/数组实现,答案是:没有区别。两者都依赖于相同的集合界面。

但它并非必须如此。如果列表实现为双向链表(在许多其他情况下),则将一个列表附加到另一个列表是O(1),而将数组附加到列表是O(n)。

我不会从基准测试开始解决这个问题。基准测试耗时很长,很容易产生易受误解的结果。在这种情况下,仔细研究实现和底层源代码(通过.NET反汇编程序可以轻松获得)将更快地回答这个问题。然后基准确认,如果它足够重要。


请注意,此处适用的特定O(1)优化仅在MyListof1000ComplexElements也是列表时才可用。如果它是某种枚举器或链表,那么性能将是O(n)。


对于那些批评这个答案的人,请注意它的写作是为了强调所给出的其他答案是基于对该问题的具体解释。他们没有指出他们对这个问题的解释范围有多窄,他们的答案有多么狭隘。另一位读者可能很容易错过这样一个事实:如果他们不这样说,这个答案只适用于这种特殊情况。我的目的只是指出在许多其他密切相关的情况下,这是一个O(n)操作而不是O(1)。