Skip to content

Linq chain queries

https://learn.microsoft.com/en-us/dotnet/standard/linq/chain-queries-example

链式组合多个 LINQ 查询时,不会产生中间集合——因为 LINQ 的标准查询操作符采用懒执行(lazy evaluation),只在最终迭代(foreach)时才逐元素拉取数据。

原理

  • LINQ 的大多数标准操作符(如 WhereSelect)是 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