无法为LINQ选择的数据分配新值

Net*_* Wu 1 c# linq foreach select

namespace ConsoleApplication4
{
    class T1
    {
        public int MyProperty { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var tmp = (new[] { 1, 3, 4 }).Select(x =>new T1 { MyProperty=x});
            foreach (var s in tmp)
            {
                s.MyProperty = 9;
            }
            foreach (var s in tmp)
            {
                Console.WriteLine(s.MyProperty);
            }
            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我预计屏幕上有三个9,但值仍然相同.

但是,如果我稍微修改代码,则值将成功更改,即:

var tmp = (new[] { 1, 3, 4 }).Select(x =>new T1 { MyProperty=x}).ToList();
Run Code Online (Sandbox Code Playgroud)

我想知道为什么?

Ren*_*ogt 6

原因是延期执行.

tmp不是列表或数组.它只是一个如何创建枚举定义.换句话说:tmp只是问题,而不是答案.

所以在第二个中foreach,由the创建的枚举器再次Select执行,创建新的实例.T1

当您使用时.ToList(),枚举将转换为a List(因此tmp是a List<T1>).您可以List根据需要随意迭代,而无需创建实例.