我只是想知道发生的事情打电话时在.ToList()上IEnumerable在C#.这些项目是否实际上被复制到堆上的全新重复项目,或者新列表是否只是引用堆上的原始项目?
我想知道因为有人告诉我调用ToList是昂贵的,而如果只是将现有对象分配给新列表,那就是轻量级调用.
我写过这个小提琴https://dotnetfiddle.net/s7xIc2 只是检查哈希码足以知道吗?
IEnumerable不必包含任何内容列表.它可以(并且经常会)在请求时解析每个当前项目.
另一方面,a IList是所有项目的完整内存副本.
所以答案是......这取决于.什么是支持你的IEnumerable?如果它的文件系统然后是,则调用.ToList可能非常昂贵.如果它已经是一个内存列表,那么不,调用.ToList不会非常昂贵.
举个例子,假设您创建了一个IEnumerable,每次生成并返回一个随机数.Next被调用.在这种情况下,调用IEnumerable上的.ToList将永远不会返回,并最终会抛出Out Of Memory异常.
但是,IEnumerable的数据库对象具有有限的边界(通常是:)),只要所有数据都适合内存,调用.ToList就完全合适了.