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

为何调用Linq GroupBy的ToList()前后resultus值从21变为90?

问题解答:为何两次输出resultus值不同?

先看你的代码:

using MeetingCases;

List<int> ourList = new List<int> { 7, 8, 7, 5, 6, 5, 5, 7, 1, 3, 7, 3, 1, 4 };
var resultus = ourList.Skip(3).Take(4).Sum();
var yay = ourList.GroupBy(key =>
{
    resultus += key;
    return key;
}).Select(z => new {z.Key, resultus });
Console.WriteLine($"Result is {resultus}");
yay.ToList();

Console.WriteLine($"Result is {resultus}");  

原因拆解:

  1. 第一次输出21的原因
    ourList.Skip(3).Take(4)会跳过前3个元素(7、8、7),取接下来的4个元素:5、6、5、5,求和后resultus的初始值就是5+6+5+5=21。这时候yay只是定义了一个LINQ查询,并没有实际执行——LINQ默认是延迟执行的,只有当需要获取查询结果时才会遍历源集合。

  2. 调用yay.ToList()后输出90的原因
    ToList()方法会强制枚举LINQ查询的结果,这时候GroupBy开始遍历ourList的每一个元素:

  • 遍历过程中,分组的key选择器代码resultus += key会被执行14次(对应列表里的14个元素),相当于把列表中所有元素的值都累加到resultus上。
  • 先算ourList的总和:7+8+7+5+6+5+5+7+1+3+7+3+1+4=69。
  • 初始resultus是21,21+69=90,所以第二次输出就是90。

关键知识点:

LINQ的延迟执行特性——查询定义阶段不会执行任何遍历操作,只有在触发枚举(比如ToList()、foreach循环、Count()等)时,才会实际执行查询逻辑,遍历源集合并执行定义好的委托代码。

内容的提问来源于stack exchange,提问作者Roman Ieromenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:22:40