下面两端代码执行结果为何不同
list.Select(x => { x.FieldA = 100; return x; });
list.ForEach(x => { Console.WriteLine(x.FieldA); });
list.Select(x => { x.FieldA = 100; return x; }).ToList();
list.ForEach(x => { Console.WriteLine(x.FieldA); });
我明白你的疑惑了。这里的关键是理解LINQ操作的“延迟执行”(deferred execution)特性,以及何时这些操作实际上被“执行”或“实现”。
对于这段代码:
list.Select(x => { x.FieldA = 100; return x; });
list.ForEach(x => { Console.WriteLine(x.FieldA); });
虽然Select方法中确实对list中的每个元素执行了一个操作(将FieldA设为100),但这个操作仅在Select生成的序列被迭代时才真正执行。在这个例子中,没有任何操作迫使Select生成的序列立即执行或被迭代。因此,Select调用本身并没有立即对list中的元素产生影响。
然而,当你调用.ToList()时:
list.Select(x => { x.FieldA = 100; return x; }).ToList();
这迫使Select操作立即执行,因为ToList()需要迭代Select生成的序列来创建一个新的列表。这个过程中,Select中的每个元素都被迭代并执行了给定的操作(修改FieldA),这导致了list中相应元素的FieldA被修改。
因此,虽然list确实是引用类型的集合,并且你在Select中修改了它的元素,但是这些修改只有在Select操作被迫立即执行时(如通过ToList(),ToArray()等方法)才真正应用到元素上。这就是为什么没有ToList()调用时,你看不到修改的原因。
总结来说,你的观察是对的:在这种情况下,需要ToList()(或类似的方法)来“实现”Select中的修改,因为这样会迫使Select操作立即执行,从而应用这些修改。
标签:ToList,执行,list,加载,linq,100,FieldA,Select,延迟 From: https://www.cnblogs.com/Nine4Cool/p/18099091