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

时间:2016-06-27 08:59:10

标签: c# linq select foreach

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();
        }
    }
}

我预计屏幕上会有 3 9 ,但值仍然相同。

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

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

我想知道为什么?

1 个答案:

答案 0 :(得分:6)

原因是延迟执行

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

因此,在第二个foreach中,由Select创建的枚举器再次执行 ,创建T1实例

当您使用.ToList()时,枚举转换为List(因此tmpList<T1>)。您可以根据需要经常迭代List,而无需创建新的实例。