You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:12:29