2013-04-22 5 views
6

Предположим, у меня есть переменная под названием PeopleCollection List<Person> типаЛи LINQ возвращает глубокую копию коллекции?

В заявлении, приведенном ниже, будет ли newPeople получить глубокую копию PeopleCollection?

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

Могут ли любые манипуляции с новыми людьми влиять на PeopleCollection?

+5

Обратите внимание, что выбор ничего не дает, вы можете просто сказать 'PeopleCollection.ToList()'. – Servy

+1

Зачем спрашивать, когда вы можете написать однострочный сканер, который точно скажет вам, что происходит? http://ideone.com/IJkfyG – Jon

+0

@Jon Правильно он может проверить себя, но это почти верно для всех вопросов здесь ... –

ответ

10

Это создаст новый список и добавит все элементы, которые были в этом списке, в новый список. Он выполнит «мелкую» копию всех этих элементов, поэтому, если эти элементы являются изменяемыми ссылочными типами, мутирующие их, они будут отражаться из любой коллекции.

Это означает, что изменения в любом из списков (добавление элементов, удаление элементов и т. Д.) Не будут отображаться в другом списке, даже если мутации для любого элемента в списке будут отображены из любой коллекции.

(Таким образом, в слове, нет, это не будет.)

+0

SO, если я изменяю свойства объекта newPeople, которые могут повлиять на PeopleCollection переменная? – developer747

+1

@ developer747 Ну, технически нет, вы не изменяете переменную 'PeopleCollection' * *. Переменная - это просто ссылка на список, и этот список - всего лишь куча ссылок на людей. Изменение. Неважно, какой список вы используете для поиска человека, нет новых людей, созданных в результате вызова 'ToList'. – Servy

3

Он возвращает List, который ссылается на те же объекты, возвращенные Enumerable.

Смежные вопросы