Linq中Take(x)是否获取x个对象后停止枚举?迭代次数疑问
Linq中Take(x)方法的枚举停止行为分析
好问题!咱们直接拆解清楚:Take(x)方法确实会在获取到x个符合条件的元素后立刻停止枚举源序列,不会傻乎乎地遍历完所有元素。
拿你给出的代码例子来说:
public static void Main(string[] args) { List<int> list = new List<int>() { 2, 3, 2, 9, 10, 2, 5 }; var result = list.Where(x => x == 2).Take(2).ToList(); }
这里的执行流程是这样的:
- Linq的
Where和Take都是延迟执行的,只有调用ToList()时才会开始枚举源列表。 - 第一次迭代:取元素2,满足
x == 2的条件,被Take收集,此时已拿到1个目标元素,继续。 - 第二次迭代:取元素3,不满足条件,跳过,继续。
- 第三次迭代:取元素2,满足条件,被
Take收集,此时已经凑够了Take(2)要求的2个元素,枚举直接终止——后面的9、10、2、5根本不会被迭代到。
所以答案很明确:此时的迭代次数是3次,不是总元素数7次。
本质上这是Linq的“短路”特性之一,Take会在满足数量要求后立刻停止遍历,避免不必要的性能消耗,这也是Linq延迟执行带来的优势之一。
内容的提问来源于stack exchange,提问作者Yahav
相关产品推荐
相关产品推荐

