Linq chain queries
https://learn.microsoft.com/en-us/dotnet/standard/linq/chain-queries-example
链式组合多个 LINQ 查询时,不会产生中间集合——因为 LINQ 的标准查询操作符采用懒执行(lazy evaluation),只在最终迭代(foreach)时才逐元素拉取数据。
原理¶
- LINQ 的大多数标准操作符(如
Where、Select)是 lazy method:调用时只构建迭代器,不立即执行; - 将两个查询链接起来,实际上是把两个迭代器嵌套在一起;每次
foreach从外层迭代器请求下一个元素时,外层再向内层请求,以此类推,最终回溯到source; - 因此,即便链式调用的每一步在语义上都"产生一个集合",在运行时也 不会有任何中间集合被实际分配。
关键摘录¶
even though we have chained together queries that yield collections, no intermediate collections are materialized.
对比¶
| 写法 | 中间集合 | 说明 |
|---|---|---|
| 链式 LINQ(懒执行) | ❌ 无 | 逐元素流式处理 |
每步调用 .ToList() |
✅ 有 | 强制在每步物化结果 |
补充¶
- 如果需要多次遍历同一查询结果,或者查询代价高昂,可以在适当位置调用
.ToList()/.ToArray()将其物化并缓存; - 懒执行是 LINQ 高效处理大序列的基础,也是与
IEnumerable<T>深度绑定的设计。
ref¶
- 来源:WuCai highlights