考虑这段代码:
int size = 100 * 1000 * 1000;
var emu = Enumerable.Range(0, size);
var arr = Enumerable.Range(0, size).ToArray();
当我调用 emu.ElementAt(size-10) 和 arr.ElementAt(size-10) 并测量 arr 的时间要快得多(与 IEnumerable 0.59s 相比,数组为 0.0002s)。
据我了解,扩展方法 Element() 具有签名
public static TSource ElementAt<TSource>(this IEnumerable<TSource> source, int index)
由于“源”是 IEnumerable,因此执行的逻辑将是类似的 - 与我所看到的直接访问数组的情况相反。
有人可以解释一下吗:)
Calling ElementAt
on an IEnumerable<T>
将循环遍历项目,直到达到所需的索引。 (O(n) 运算)
Calling ElementAt
on an IList<T>
(例如数组)将使用IList<T>
的索引器立即获得所需的索引。 (O(1) 操作)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)