为何调用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}");
原因拆解:
第一次输出21的原因
ourList.Skip(3).Take(4)会跳过前3个元素(7、8、7),取接下来的4个元素:5、6、5、5,求和后resultus的初始值就是5+6+5+5=21。这时候yay只是定义了一个LINQ查询,并没有实际执行——LINQ默认是延迟执行的,只有当需要获取查询结果时才会遍历源集合。调用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
相关产品推荐
相关产品推荐

