LINQ IEnumerable <T>内存结构

Per*_*nce 4 c# linq memory

因此,我了解所有中最常见的集合C#都实现了IEnumerable<T>接口:List<T>T[]并且Dictionary<TKey,TVal>全部都执行此操作。

但是,当您运行LINQ查询时,例如:

myCol.Where(myBoolMethod);

您以实现的未知类型返回数据IEnumerable<T>

因此,我不知道这个数据是如何实际存储,直到你把它转换成一个有用的格式通过.ToList().ToArray()等等。

是否保留在来源类型中?它是否存储在伪数组中?是以上几种的组合吗?

除此之外,是否有任何理由为什么转换为一种类型IEnumerable<T>总是比转换为另一种类型更快-即在哪里myCol.Where(myBoolMethod).ToArray()总是比所myCol.Where(myBoolMethod).ToList()涉及的数据类型快?

Dam*_*ver 5

它没有存储。它表示在以后的某个时间点获取数据的能力,但数据本身仍潜伏在组成linq查询的原始集合中。(以及用于从表达式创建新值的任何逻辑)

这就是为什么ToXxx如果您实际上有可能导致查询多次执行,那么不建议使用一种方法来存储这些结果的各种建议。