扩展方法如何ToList()
工作?假设我有IEnumerable
10000 个项目。将ToList()
创建一个新的List
并迭代IEnumerable
10000 个项目,然后返回给我一个List
或 .NET 是否以其他方式做到这一点?
这个MSDN 链接讨论了立即执行数据库查询。我的问题只是关于转换IEnumerable
为List
.
扩展方法如何ToList()
工作?假设我有IEnumerable
10000 个项目。将ToList()
创建一个新的List
并迭代IEnumerable
10000 个项目,然后返回给我一个List
或 .NET 是否以其他方式做到这一点?
这个MSDN 链接讨论了立即执行数据库查询。我的问题只是关于转换IEnumerable
为List
.
它不一定会迭代,尽管那是“最坏的情况”。基本上它调用new List<T>(source)
,但这有一些技巧:如果源实现ICollection<T>
,构造函数可以调用ICollection<T>.CopyTo()
以将完整的数据复制到数组中。这可能比单步迭代更有效地实现。同样在这种ICollection<T>
情况下,新列表知道开始的最终大小,因此它不需要继续扩展其内部缓冲区。
有关更多详细信息,请参阅我的EdulinqToList()
博客文章。
.ToList
扩展方法调用构造函数,List<T>
将IEnumerable<T>
. 此构造函数将遍历并以返回的相同顺序IEnumerable<T>
复制 的元素。IEnumerable<T>