C# LINQ List Select查询连续执行返回结果不一致问题求助
问题原因
这是LINQ**延迟执行(惰性求值)**特性结合闭包变量修改导致的问题:
- 你定义的
completeItems没有存储实际的计算结果,只是保存了Select构造的查询逻辑,默认不会立即执行。 - 每次调用
Dump()遍历completeItems时,都会完整执行一遍Select中的委托代码。 - 你在
Select委托中修改了外部变量openValue,第一次执行完查询后,openValue已经被更新为最后一条数据的CloseValue也就是1700,第二次执行查询时初始值不再是你定义的1000,因此得到错误的计算结果。
修复方案
在查询构造完成后立即触发执行,把计算结果固化到本地集合中即可,只需要在Select后面追加ToList()或者ToArray():
var completeItems = items.Select(x => { var item = new TestItem { EndDate = x.EndDate, OpenValue = openValue, CloseValue = x.CloseValue, }; openValue = item.CloseValue; return item; }).ToList(); // 新增此行,立即执行查询并把结果存入List,后续操作不会再重新计算
修改后两次Dump()调用都会直接读取已经计算好的集合内容,输出结果完全一致。
内容的提问来源于stack exchange,提问作者mrDavid
相关产品推荐
相关产品推荐

