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 where
myCol.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()
时,它实际上使用枚举器来创建一个新数组

啊,那就更有意义了,谢谢你。除非有更好的答案,否则一旦超过期限,我会接受这个答案。