c#list选择意外(对我而言)行为

时间:2017-02-01 18:51:23

标签: c# .net linq

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行后会发生变化?

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");