C#中IEnumerable<T>异常行为:赋值后Value为何仍为null?
问题原因:LINQ延迟执行特性导致的对象重复创建
你的代码核心问题出在LINQ的延迟执行机制上,具体逻辑如下:
GetAList()返回的IEnumerable<A>是一个延迟执行的LINQ查询结果。Select操作不会在调用时就创建所有A对象,而是在每次枚举(遍历)这个IEnumerable时,才会执行new A { Name = _.ToString() }的逻辑,生成新的A实例。第一次
foreach遍历aList时,触发了查询执行:遍历数组{1,2,3},创建3个A对象,给它们的Name赋值,并设置Value = 1.0。但这些对象没有被持久化存储,遍历结束后就失去了引用。当调用
aList.ToList()时,会再次触发LINQ查询的执行:重新遍历数组,创建3个全新的A对象,这些新对象仅初始化了Name,Value保持默认的null,最终被存入aResult列表。
解决办法
要避免这种问题,只需要让LINQ查询立即执行并保存结果,终止延迟执行状态:
- 方案一:在
GetAList中直接返回已实例化的列表
public static List<A> GetAList() { var arr = new int[] { 1, 2, 3 }; return arr.Select(_ => new A { Name = _.ToString() }).ToList(); }
- 方案二:获取
aList时立即转为列表
var aList = GetAList().ToList();
这样后续的遍历和修改操作都会针对同一批对象,修改后的Value会被保留在最终的列表中。
内容的提问来源于stack exchange,提问作者TeaLocust
相关产品推荐
相关产品推荐

