我遇到了一个问题,我注意到使用linq设置成员似乎没有用。所以我构建了这个非常具体的代码来展示一个例子。
为什么SomeClass实例的成员没有在第一个ForEach中设置?
using System;
using System.Linq;
public class Program
{
class SomeClass
{
public float val = 0f;
}
public static void Main()
{
var arr = Enumerable.Range(0, 1).Select(x => new SomeClass());
arr.ToList().ForEach(x => x.val = 2f);
// Outputs 0
Console.WriteLine(arr.Select(x => x.val).First());
var list = arr.ToList();
list.ForEach(x => x.val = 2f);
// Outputs 2
Console.WriteLine(list.Select(x => x.val).First());
}
}
答案 0 :(得分:6)
您永远不会将查询存储在集合中,这是因为ToList()
:
var list = Enumerable.Range(0, 1).Select(x => new SomeClass()).ToList();
list.ForEach(x => x.val = 2f);
请注意,您的arr.ToList()
会创建一个集合,但它永远不会存储在任何地方。所以SomeClass
实例也只是暂时的。每当您稍后访问arr
时,您将创建新实例。您应该阅读LINQ的延期执行。
答案 1 :(得分:0)
Linq选择查询添加.ToList()