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

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

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

但是,如果我稍微修改一下代码,值就会成功更改,即:

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

我想知道为什么?

最佳答案

原因是延迟执行

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

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

当您使用 .ToList() 时相反,枚举被转换为 List (所以 tmp 是一个 List<T1> )。你可以迭代List无需创建实例即可随心所欲。

关于c# - 无法为 LINQ 选择的数据分配新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38049728/

相关文章:

c# - 在using子句中的类上调用Close是有益,有害还是无谓的?

c# - 运算符 && 不能应用于 decimal 和 decimal 类型的操作数

c# - 序列化对于对象大小估计可靠吗?

c# - LINQ 从比较字符串的列表中获取最佳匹配

xml - 在 F# 中使用序列从对象中选择属性

c#.Net : Execute two SQL statements at a time

c# - 标准表达式中的数据类型不匹配。在选择查询中 C# Access 数据库

json - jq json过滤器并保持原始结构

c# - 在 Windows 8 应用程序中从导航堆栈弹出页面

c# - 通过 StreamWriter 或文件写入修改数据?