如何对IEnumerable工作上的ToList()?

时间:2012-12-06 06:46:11

标签: c# .net list ienumerable

扩展方法ToList()如何运作?假设我有一个10000 IEnumerable项。 ToList()会创建一个新的List并迭代10000个项目的IEnumerable,然后返回List或.NET以其他方式执行吗?

MSDN link讨论了立即执行数据库查询的问题。我的问题只是将IEnumerable转换为List

2 个答案:

答案 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>的元素。