2013-04-22 33 views
6

Załóżmy, że mam zmienną PeopleCollection z List<Person> typuCzy LINQ zwraca głęboką kopię kolekcji?

W poniższym oświadczeniem, że NewPeople uzyskać głęboką kopię PeopleCollection?

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

Czy jakakolwiek manipulacja nowymi ludźmi wpłynie na PeopleCollection?

+5

Zauważ, że selekcja nie przynosi produktywnego efektu, możesz po prostu wymówić 'PeopleCollection.ToList()'. – Servy

+1

Po co pytać, kiedy można napisać jednolinijkową, która mówi dokładnie, co się dzieje? http://ideone.com/IJkfyG – Jon

+0

@Jon To prawda, że ​​może sam sprawdzić, ale to jest prawie prawdziwe dla wszystkich pytań tutaj ... –

Odpowiedz

10

Spowoduje to utworzenie nowej listy i dodanie wszystkich elementów znajdujących się na tej liście do nowej listy. Wykona on "płytką" kopię wszystkich tych elementów, więc jeśli te elementy są zmienne, ich mutacje zostaną odzwierciedlone z obu kolekcji.

Oznacza to, że zmiany na samej liście (dodawanie elementów, usuwanie elementów itp.) Nie będą odzwierciedlane na drugiej liście, nawet jeśli mutacje do dowolnej pozycji na liście będą odzwierciedlone z dowolnej kolekcji.

(Więc jednym słowem, nie, to nie będzie.)

+0

SO, jeśli zmienię właściwości obiektu w new People, które mogłyby wpłynąć na PeopleCollection zmienna? – developer747

+1

@ developer747 No, technicznie nie, nie modyfikujesz zmiennej 'PeopleCollection' *. Zmienna jest po prostu odniesieniem do listy, a ta lista to tylko kilka odniesień do ludzi. Zmiana Nie ma znaczenia, której listy używasz, aby znaleźć osobę, nie ma nowych osób utworzonych w wyniku połączenia z 'ToList'. – Servy

3

Zwraca List odwołujący tych samych obiektów zwracanych przez Enumerable.

Powiązane problemy