C# LINQ IEnumerable<;T>;记忆结构
所以我知道C# LINQ IEnumerable<;T>;记忆结构,c#,linq,memory,C#,Linq,Memory,所以我知道C#中最常见的集合都实现了IEnumerable接口:List,T[]和Dictionary都实现了这一功能 但是,当运行LINQ查询时,例如: myCol.Where(myBoolMethod) 将以实现IEnumerable的未知类型返回数据 因此,我想知道在您通过.ToList(),.ToArray()等将其转换为更有用的格式之前,这些数据实际上是如何存储的 它是否保留在源的类型中?它是否存储在伪数组中?这是上述的某种组合吗 除此之外,转换为一种类型的IEnumerable总是比
C#
中最常见的集合都实现了IEnumerable
接口:List
,T[]
和Dictionary
都实现了这一功能
但是,当运行LINQ查询时,例如:
myCol.Where(myBoolMethod)代码>
将以实现IEnumerable
的未知类型返回数据
因此,我想知道在您通过.ToList()
,.ToArray()
等将其转换为更有用的格式之前,这些数据实际上是如何存储的
它是否保留在源的类型中?它是否存储在伪数组中?这是上述的某种组合吗
除此之外,转换为一种类型的IEnumerable
总是比转换为与-ie wheremyCol.where(myBoolMethod)不同的类型要快。ToArray()
总是比myCol.where(myBoolMethod.ToList()快
不考虑涉及的数据类型?它不会被存储。它表示在稍后时间点获取数据的能力,但数据本身仍然隐藏在组成linq查询的原始集合中。(以及用于从表达式创建新值的任何逻辑)
这就是为什么有各种各样的警告不使用ToXxx
方法来存储这些结果,如果您有可能实际导致查询执行多次。这实际上是WhereEnumerableIterator
(如果mycl是IEnumerable
)。
它只包含对初始mycl
的引用和对Func
的引用
如果mycl是另一种类型,那么它可能是另一种更优化的LINQ迭代器
它是否保留在源的类型中?它是否存储在伪数组中?这是上述的某种组合吗
大多数LINQ扩展方法将在每次访问生成的IEnumerable
(称为延迟执行)时循环源代码。结果通常不存储在中间源中
转换为一种IEnumerable类型总是比转换为另一种IEnumerable类型更快,这有什么原因吗
是的,调用ToArray
或ToList
将执行枚举并具体化它。如果不使用返回的IEnumerable
,它将不会具体化。执行myCol.Where(myBoolMethod)
时,对性能的影响约为0。。它不存储在数组或其他任何形式中,您只需获得枚举器即可枚举此集合
当您执行
.ToArray()
时,它实际上使用枚举器来创建一个新数组 啊,那就更有意义了,谢谢你。除非有更好的答案,否则一旦超过期限,我会接受这个答案。