2015-04-30 2 views
1

Я застрял со следующим поведением:Брус обновление IEnumerable итерационная переменная

var contracts = result.Select(this.Map); 
foreach (var contract in contracts) { 
    contract.Id = 1; 
} 

return contracts; 

После цикла contract.id не были обновлены и по-прежнему имеют начальное значение.

var contracts = result.Select(this.Map).ToList(); решил мою проблему, но я не могу понять, почему я не могу обновить свойства итерационной переменной?

+0

Рекомендация в этих случаях: Не используйте 'var', используйте явный тип. – ytoledano

+0

@ytoledano Это совет, который обычно дается, когда человек не понимает, что их переменная была типом, который на самом деле существует. Название их вопроса дает понять, что они знают, что тип - это «IEnumerable», которым он является. Если бы они думали, что это то, чего не было, это было бы признаком того, что «var» их кусало. – Servy

ответ

3

Вы должны помнить, что Результаты запроса LINQ - это объект, представляющий запрос, а не результаты этого запроса. contracts - это объект, который при повторении выполняет сопоставление каждого объекта в базовой коллекции с новым объектом. Каждый раз, когда он повторяется, он снова выполняет отображение.

В вашем случае вы Итерируя коллекцию источника, выполняя отображение, редактирование этих объектов, бросать эти предметы на полу, снова перебор коллекции, снова выполняя отображение, а затем, глядя на этих объектах, так конечно, редактирование, которое вы сделали, не видно.

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

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