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


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

我希望屏幕上有三个9,但是值仍然是相同的。

然而,如果我稍微修改一下代码,值就会成功改变,即:

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

我想知道为什么?

原因是延迟执行

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

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

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

相关内容

  • 没有找到相关文章

最新更新