1. var test = new List<foo>() { new foo { prop1 ="1prop1", prop2 = "1prop2" }, new foo { prop1 = "2prop1", prop2 = "2prop2" } };
2. var test2 = test.Select(x => x.prop1 = "changed");
3. var test3 = test2.First();
请向我解释这种行为。
为什么foo.prop1值在第3行后会发生变化?
答案 0 :(得分:2)
这与延迟执行有关。大多数linq方法推迟执行,直到实际枚举生成的枚举。因此,当您运行Select语句时,它只会创建一个可以运行相应选择器的Enumerable。
当您在枚举上调用First
时,它会对第一个项目运行转换,从而更改其值。
这一切都假定您打算写x.prop1 = "changed"
而不是x.prop1 == "changed"
。前者是赋值运算符,它设置x.prop1
的值并返回设置值。后者是等于运算符,将根据它们是否相等返回一个布尔值。
答案 1 :(得分:2)
=
是赋值,这意味着它实际上会更改值。
您希望使用==
代替检查以获得相等。
尝试:
var test2 = test.Select(x => x.prop1
的 == 强> "changed");
答案 2 :(得分:1)
当您可能想要进行相等比较=
时,您正在进行作业==
。
var test2 = test.Select(x => x.prop1 == "changed");