我只是想知道打电话时发生了什么.ToList()
on an IEnumerable
在 C# 中。这些项目实际上是否被复制到堆上全新的重复项目,或者新列表只是引用堆上的原始项目?
我很想知道,因为有人告诉我调用 ToList 的成本很高,而如果只是将现有对象分配给新列表,那么这是一个轻量级调用。
我写了这个小提琴https://dotnetfiddle.net/s7xIc2 https://dotnetfiddle.net/s7xIc2仅仅检查哈希码就足以知道吗?
IEnumerable
不必包含任何内容的列表。它可以(而且经常)解决每个问题当前项目在被请求时。
另一方面,一个IList
是所有项目的完整内存副本。
所以答案是……这要看情况。
是什么支撑着你的 IEnumerable?如果是文件系统,那么调用 .ToList 可能会非常昂贵。如果它已经是内存中的列表,那么不,调用 .ToList 不会非常昂贵。
举个例子,假设您创建了一个 IEnumerable,每次调用 .Next 时都会生成并返回一个随机数。在这种情况下,对 IEnumerable 调用 .ToList 将永远不会返回,并且最终会引发内存不足异常。
但是,数据库对象的 IEnumerable 具有有限范围(通常:)),并且只要所有数据都适合内存,调用 .ToList 就完全合适。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)