Я столкнулся с (для меня) странным поведением. Вот код:Является ли 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
, это запрос к БД, я пропустил детали. Затем я должен выполнить другие вычисления, и в конце я перебираю мои объекты, чтобы задать еще один параметр. Запустив этот код, как только объекты IEnumerable
будут возвращены, их Property
не установлен.
В противном случае, если я двигаю ToList()
в выражении Linq, как последовавший 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) –
Когда вы do 'objects.ToList()' запрос выполняется. Затем вы возвращаете «объекты». Предположим, что кто-то затем перебирает этот возвращенный объект: в этом случае запрос будет выполнен снова (так будут созданы новые объекты) –
'var objects' без' ToList' - это просто запрос, поэтому определение не выполняется. Если вы материализуете его, например, с помощью 'ToList' или' forach', он выполняется. Таким образом, добавляя «ToList», база данных запрашивается и заполняется список в памяти. 'List.ForEach' перечислит их, и вы измените свойство. В первом подходе этот список немедленно отбрасывается, поскольку он не сохраняется в переменной. Вторая версия верна. –