我经常遇到一些情况,仅有IEnumerable是不够的。但是我对上述方法调用的性能不确定。
我真正想问的是:
ToList/ToArray的性能:
- 是否为O(n)操作,将IEnumerable复制到一个新的数组/List中?
如果我在列表上调用linq扩展方法,如果调用ToList,则其性能为O(1),但如果调用ToArray,则为O(n)(反之亦然,如果我的原始列表是一个数组)?
是否发生了某些魔法,使性能为O(1)?
可能转换为Dictionary是O(n),对吗?
我经常遇到一些情况,仅有IEnumerable是不够的。但是我对上述方法调用的性能不确定。
我真正想问的是:
ToList/ToArray的性能:
如果我在列表上调用linq扩展方法,如果调用ToList,则其性能为O(1),但如果调用ToArray,则为O(n)(反之亦然,如果我的原始列表是一个数组)?
是否发生了某些魔法,使性能为O(1)?
可能转换为Dictionary是O(n),对吗?
ToList
/ToArray
的性能是 O(n),会将IEnumerable
复制到一个新的数组/List 中吗?
是的。 ToList
稍微更有效率,因为它不需要先修剪内部缓冲区到正确的长度。
如果我在列表上调用 linq 扩展方法,如果我调用 ToList,则其性能为 O(1),但如果我调用 ToArray,则其性能为 O(n)(如果我的原始列表是数组,则相反)?
不是这样的。对于两个调用,总是创建一个新的集合;那是原始集合的浅拷贝。调用任何 ICollection<T>
上的 ToList
或 ToArray
比在简单的没有实现 ICollection<T>
的 IEnumerable<T>
上调用更有效率,因为集合的长度一开始就是已知的。(尽管这在执行时被检测到;您不需要担心编译时类型。)
假设哈希是合理的,那么时间复杂度为O(N)。基本上,它会按照你预期的方式创建一个新的字典。可能转换为 Dictionary 是 O(n),对吗?
ToList
- ToArray
- ToDictionary