私に(私にとって)奇妙な動作が発生しました。ここでは、コードは次のとおりです。含まれる要素のコピーを生成するLinq-QueryがtoList()と呼ばれていますか?
var objects = from i in items
//some calculations
select something;
// other calculations
objects.ToList().ForEach(x => {
//some calculations
x.Property = "some text"
});
return objects;
まず私はIEnumerable
を生成し、それは私が詳細をスキップし、DBへのクエリです。 それから私は他の計算をしなければなりません。最後に私のオブジェクトを繰り返し処理して、さらなるパラメータを設定します。このコードを実行すると、IEnumerable
オブジェクトが返されると、Property
は設定されません。私は、LINQの式でToList()
を移動した場合
は、そうでない場合は以下のように、Property
が設定されている:
var objects = (from i in items
//some calculations
select something).ToList();
// other calculations
objects.ForEach(x => {
//some calculations
x.Property = "some text"
});
return objects;
として、私の知る、オブジェクトは右...コピーされますが、参照されていませんか? コードの背後には何が起こりますか?違いはなんですか?
[ToList()の複製 - 新しいリストを作成しますか?](http://stackoverflow.com/questions/2774099/tolist-does-it-create-a-new-list) –
'objects.ToList()'を実行すると、クエリが実行されます。そして 'オブジェクト 'を返します。だれかが返されたオブジェクトを繰り返し処理するとしましょう:この場合、クエリは再度実行されるので(新しいオブジェクトが作成されます) –
'ToList'を持たない' var objects'は単なるクエリなので、定義は実行されません。たとえば、 'ToList'や' forach'を使って実現すると、それが実行されます。したがって、 'ToList'を追加することによってデータベースが照会され、メモリ内のリストが埋められます。 'List.ForEach'はそれらを列挙し、プロパティを変更します。最初のアプローチでは、このリストは変数に格納されていないため、すぐに破棄されます。 2番目のバージョンは正しいです。 –