2017-02-01 1 views
-2
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(); 

この現象を私に説明してください。
なぜ3行目以降にfoo.prop1の値が変わるのですか?c#list select unexpected(私にとっては)動作

+0

まさにあなたはそれがなかったことをやって期待していましたか? – csmckelvey

+2

x.prop1 = "changed"をx.prop1 == "changed"に変更する必要があります。 ==は平等テストです – Mangist

+0

私は心からお詫び申し上げますが、なぜあなたはすべて「=」から「==」に変更する必要があると決断しましたか?本当にそうだね、なぜ?質問はなぜ価値が変わるのか? –

答えて

2

これは、遅延実行と関係がある。ほとんどのlinqメソッドは、結果として得られる列挙型が実際に列挙されるまで実行を延期します。したがって、Selectステートメントを実行すると、適切なセレクターを実行するためのEnumerableが作成されます。

列挙型にFirstを呼び出すと、最初の項目で変換が実行され、その値が変更されます。

これはすべてx.prop1 = "changed"であり、x.prop1 == "changed"ではないことを意図していることを前提としています。前者は、x.prop1の値を設定し、設定値を返す代入演算子です。後者は等価演算子で、等しいかどうかに基づいてブール値を返します。

+0

はい、実行を中止しました 2行目のコードがtest2 = test.select(x => {x.prop1 = changed; return x})だった場合、 そして第3行は列挙子を呼び出していましたが、すべてがOKです。 与えられた例では、test2がList になります。正確には{'changed'、 'changed'}です。 'test'これはリストです? –

+0

私はあなたが言っていることを理解していません。引用したものに2行目を変更するとあなたが持っている2行目と全く同じこと。また、与えられた例では、test2は 'List '型ではなく* IEnumerable '型になります。呼び出し元の列挙子がtestの値を変更するのはなぜですか?それはあなたがするように言ったからです。代入を使ってprop1の値を変更し、最初の項目を反復したときに指示したコードを実行して値を変更しました。 – Chris

1

等価比較==を作成したい場合は、=という割り当てをしています。

var test2 = test.Select(x => x.prop1 == "changed"); 
2

=は、実際に値が変更されることを意味します。

代わりに==を使用したい場合は、のチェックと同等です。

試してみてください。

var test2 = test.Select(x => x.prop1=="changed");

関連する問題