C# 链式调用多个LINQ方法时会多次枚举集合吗?
直接结论
你给出的示例代码中,myList只会被枚举1次,不会因为链式调用了Where和Select两个方法就枚举2次。
具体原理
- LINQ绝大多数返回
IEnumerable<T>的标准查询运算符默认都是延迟执行的:你写的Where、Select调用只是在拼接查询逻辑,不会立刻遍历源集合,只有当你实际触发查询执行时(比如调用ToList()、ToArray()、用foreach遍历查询结果、或者对结果调用Count()/First()这类聚合方法),才会真正开始遍历源集合。 - 执行时所有链式拼接的操作会合并成单次遍历逻辑:每从
myList取出一个元素,就依次经过所有你定义的筛选、变换逻辑,符合条件就输出结果,不需要给每一步操作单独遍历一遍源集合。
普遍规则
只要你链式调用的都是延迟执行的LINQ方法,中间没有插入ToList()/ToArray()/ToDictionary()这类会立即执行、把结果缓存到新集合的操作,不管你链式调用多少个LINQ方法,源集合都只会被枚举1次。
注意:如果同一个查询对象被多次触发执行(比如你先把查询结果
ToList一次,之后又用foreach遍历同一个查询对象),每次触发都会重新枚举一次源集合。如果源集合枚举开销大或者是动态变化的,建议主动调用ToList把结果缓存下来避免重复枚举。
内容的提问来源于stack exchange,提问作者Anthony Bias
相关产品推荐
相关产品推荐

