23

好吧,我遇到了很多情况,其中有一个 IEnumerable 是不够的。但是我不确定上述方法调用的性能。

我真正想问的是:

是 ToList/ToArray 的表现:

  1. 将 IEnumerable 复制到新数组/列表的 O(n) 操作?
  2. 如果我在列表上调用 linq 扩展方法,如果我调用 ToList,它具有 O(1) 性能,但如果调用 ToArray,它具有 O(n) 性能(如果我的原始列表是一个数组,则相反)?

  3. 发生了一些神奇的事情,性能是 O(1)?

可能字典是 O(n),对吧?

4

1 回答 1

49

ToList/的性能是ToArray一个 O(n) 操作,它将 复制IEnumerable到一个新的数组/列表?

是的。ToList效率稍高一些,因为它不需要先将内部缓冲区修整到正确的长度。

如果我在列表上调用 linq 扩展方法,如果我调用 ToList,它具有 O(1) 性能,但如果调用 ToArray,它具有 O(n) 性能(如果我的原始列表是一个数组,则相反)?

不会。对于这两个调用,总是会创建一个新集合;这是原始集合的浅拷贝。ToList调用或调用ToArrayany比调用未实现ICollection<T>的 simple更有效,因为对于已知长度的集合开始。(虽然这是在执行时检测到的;您不必担心编译时类型。)IEnumerable<T>ICollection<T>

可能字典是 O(n),对吧?

假设哈希是合理的,它是 O(N),是的。基本上,它完全按照您可能期望的方式创建了一个新字典。

您可能想阅读我的 Edulinq 博客系列中的相应帖子:

于 2013-02-23T15:19:11.523 回答