好吧,我遇到了很多情况,其中有一个 IEnumerable 是不够的。但是我不确定上述方法调用的性能。
我真正想问的是:
是 ToList/ToArray 的表现:
- 将 IEnumerable 复制到新数组/列表的 O(n) 操作?
如果我在列表上调用 linq 扩展方法,如果我调用 ToList,它具有 O(1) 性能,但如果调用 ToArray,它具有 O(n) 性能(如果我的原始列表是一个数组,则相反)?
发生了一些神奇的事情,性能是 O(1)?
可能字典是 O(n),对吧?
好吧,我遇到了很多情况,其中有一个 IEnumerable 是不够的。但是我不确定上述方法调用的性能。
我真正想问的是:
是 ToList/ToArray 的表现:
如果我在列表上调用 linq 扩展方法,如果我调用 ToList,它具有 O(1) 性能,但如果调用 ToArray,它具有 O(n) 性能(如果我的原始列表是一个数组,则相反)?
发生了一些神奇的事情,性能是 O(1)?
可能字典是 O(n),对吧?
ToList
/的性能是ToArray
一个 O(n) 操作,它将 复制IEnumerable
到一个新的数组/列表?
是的。ToList
效率稍高一些,因为它不需要先将内部缓冲区修整到正确的长度。
如果我在列表上调用 linq 扩展方法,如果我调用 ToList,它具有 O(1) 性能,但如果调用 ToArray,它具有 O(n) 性能(如果我的原始列表是一个数组,则相反)?
不会。对于这两个调用,总是会创建一个新集合;这是原始集合的浅拷贝。ToList
调用或调用ToArray
any比调用未实现ICollection<T>
的 simple更有效,因为对于已知长度的集合开始。(虽然这是在执行时检测到的;您不必担心编译时类型。)IEnumerable<T>
ICollection<T>
可能字典是 O(n),对吧?
假设哈希是合理的,它是 O(N),是的。基本上,它完全按照您可能期望的方式创建了一个新字典。
您可能想阅读我的 Edulinq 博客系列中的相应帖子: