LINQ ForEach没有设置成员

时间:2017-07-10 11:05:10

标签: c# linq

我遇到了一个问题,我注意到使用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());
    }
}

https://dotnetfiddle.net/j0oLUh

2 个答案:

答案 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()