c# - 为什么我不能在 foreach 循环中设置迭代变量的属性?

标签 c# linq foreach

string newName = "new name";

int[] numbers = new int[] { 1, 2, 3 };

var people = numbers.Select(n => new Person()
{
    Name = n.ToString()
});

foreach (var person in people)
{
    person.Name = newName;
}

Debug.WriteLine(people.First().Name == newName); // returns false

我希望上面的行返回 true。为什么我不能在 foreach 循环内设置迭代变量的属性?

最佳答案

people 是一个延迟执行的查询定义。您对查询的 foreach 是无关紧要的,这与无法设置属性无关。当您调用 First() 时,您再次运行查询。

明确一点,这里的查询定义是针对numbers中的元素,新建一个Person,并将当前number元素的值赋值给Person的Name属性。当您在 foreach 循环中进行迭代时,查询会求值,并且您会创建新的 Person 对象。但是那些 Person 对象不在查询中,它只是一个定义!再次运行查询会再次执行定义,创建不同 Person 对象。您修改查询的原始结果这一事实不会影响第二组结果。

如果你想立即执行,使用

var people = numbers.Select(n => new Person() 
    { 
        Name = n.ToString() 
    }).ToList(); 

您会发现循环中的更改一直存在,因为现在 people 是一个具体列表而不是查询定义。

foreach (var person in people) 
{ 
     person.Name = newName; 
} 

Debug.WriteLine(people.First().Name.Equals(newName)); // returns true

关于c# - 为什么我不能在 foreach 循环中设置迭代变量的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9122979/

相关文章:

jquery 在 foreach 循环期间从数组中删除元素

javascript - JavaScript中forEach回调函数的第三个参数是什么意思

c# - 在 C# 中序列化数组

c# - XML LINQ 转换

c# - 为此排序 lambda 表达式

linq - 如何使用 Lambda 表达式加入 LINQ 并在 DTO 中获取结果?

php - foreach 不填充数组

C# 非矩形按钮

c# - 任何 (.NET) Redis SessionStore 库?

c# - 无符号整数的一元取反