扩展方法ToList()
如何运作?假设我有一个10000 IEnumerable
项。 ToList()
会创建一个新的List
并迭代10000个项目的IEnumerable
,然后返回List
或.NET以其他方式执行吗?
此MSDN link讨论了立即执行数据库查询的问题。我的问题只是将IEnumerable
转换为List
。
答案 0 :(得分:22)
它不一定会迭代,尽管这是“最坏情况”的情况。基本上它调用new List<T>(source)
,但是它有一些技巧:如果源实现ICollection<T>
,构造函数可以调用ICollection<T>.CopyTo()
将完整数据复制到数组中。与单步迭代相比,这可以更有效地实现。同样在ICollection<T>
情况下,新列表知道要开始的最终大小,因此不需要继续扩展其内部缓冲区。
有关详细信息,请参阅我的Edulinq ToList()
blog post。
答案 1 :(得分:3)
.ToList
扩展方法调用List<T>
构造函数传递IEnumerable<T>
。此构造函数将迭代IEnumerable<T>
并按照返回的相同顺序复制IEnumerable<T>
的元素。