8

扩展方法如何ToList()工作?假设我有IEnumerable10000 个项目。将ToList()创建一个新的List并迭代IEnumerable10000 个项目,然后返回给我一个List或 .NET 是否以其他方式做到这一点?

这个MSDN 链接讨论了立即执行数据库查询。我的问题只是关于转换IEnumerableList.

4

2 回答 2

22

它不一定会迭代,尽管那是“最坏的情况”。基本上它调用new List<T>(source),但这有一些技巧:如果源实现ICollection<T>,构造函数可以调用ICollection<T>.CopyTo()以将完整的数据复制到数组中。这可能比单步迭代更有效地实现。同样在这种ICollection<T>情况下,新列表知道开始的最终大小,因此它不需要继续扩展其内部缓冲区。

有关更多详细信息,请参阅我的EdulinqToList()博客文章

于 2012-12-06T06:49:50.483 回答
3

.ToList扩展方法调用构造函数,List<T>IEnumerable<T>. 此构造函数将遍历并以返回的相同顺序IEnumerable<T>复制 的元素。IEnumerable<T>

于 2012-12-06T06:50:38.133 回答