2013-04-22 6 views
6

はnewPeopleがPeopleCollectionの深いコピーになるだろう、私は以下の声明でList<Person>タイプLINQはコレクションの深いコピーを返しますか?

のPeopleCollectionという変数があると?

var newPeople=(from p in PeopleCollection select p).ToList(); 

newPeopleへの操作は、PeopleCollectionに影響しますか?

+5

selectは何も生産的ではないことに注意してください。ちょうど 'PeopleCollection.ToList()'と言うことができます。 – Servy

+1

何が起こるかを正確に示すワンライナーを書くことができるのはなぜですか? http://ideone.com/IJkfyG – Jon

+0

@Jon彼は自分自身をチェックするのは正しいですが、これはここのすべての質問にほぼ当てはまります... –

答えて

10

これにより、新しいリストが作成され、そのリストにあったすべてのアイテムが新しいリストに追加されます。これらのアイテムのすべての「浅い」コピーが実行されるため、これらのアイテムが変更可能な場合、それらのアイテムを変更する参照タイプはどちらのコレクションからも反映されます。

これは(など、項目の追加項目を削除)のいずれか、リスト自体への変更は、リスト内の任意の項目に突然変異がいずれかのコレクションから反射されるにもかかわらず、他のリストに反映されないことを意味します。

(だから、言葉では、いや、それはしません。)

+0

したがって、私はnewPeopleでオブジェクトのプロパティを変更するとPeopleCollectionに影響する可能性があります変数? – developer747

+1

@ developer747技術的には、あなたは 'PeopleCollection' *変数*を変更していません。変数は単なるリストへの参照であり、そのリストは人への参照の束です。変更人を見つけるためにどのリストを使うかは関係ありません。ToListを呼び出した結果、新しい人物は作成されません。 – Servy

3

それはEnumerableによって返された同じオブジェクトを参照するListを返します。

関連する問題