我遇到很多情况,其中IEnumerable是不够的。但是我不确定上述方法调用的性能。
我真正想问的是:
是ToList / ToArray的表现:
如果我在列表上调用linq扩展方法,如果我调用ToList则它具有O(1)性能,如果调用ToArray则具有O(n)(如果我的原始列表是数组则相反)?
有些神奇的事情发生了,性能是O(1)?
可能是字典是O(n),对吧?
答案 0 :(得分:44)
ToList
/ToArray
的性能是否是将IEnumerable
复制到新数组/列表的O(n)操作?
是。 ToList
效率稍高,因为它不需要先将内部缓冲区修剪到合适的长度。
如果我在列表上调用linq扩展方法,如果我调用ToList则它具有O(1)性能,如果调用ToArray则具有O(n)(如果我的原始列表是数组则相反)?
没有。对于这两个调用,始终会创建 new 集合;这是原始集合的浅层副本。在任何ToList
上调用ToArray
或ICollection<T>
比在没有实现IEnumerable<T>
的简单ICollection<T>
上调用效率更高,就像收集长度一样众所周知。 (但这在执行时检测到;您不必担心编译时类型。)
可能是字典是O(n),对吧?
假设散列是明智的,那就是O(N),是的。基本上它会以您可能期望的方式创建一个新词典。
您可能想阅读我的Edulinq博客系列中的相应帖子: