#c# #linq
#c# #linq
Вопрос:
У меня есть список объектов POCO, почему следующий код:
elements.Where(x => x.Param1 == "M").Select(x => x.Param2= "").ToList();
(TL; DR; устанавливает param2 = «» для каждого элемента, для которого param1 равно M)
обновляет перечисляемый, в то время как этот:
elements.Where(x => x.Param1 == "M").Select(x => x.Param2= "");
не обновляет его?
Обратите внимание, что я elements = elements.Where...
не делаю ни var results = elements.Where...
Комментарии:
1. Ваш запрос не будет выполнен, пока вы не вызовете ToList , toArray или цикл по нему. blogs.msdn.com/b/charlie/archive/2007/12/09 /…
2. Он перечисляет только при вызове
toList()
.
Ответ №1:
Ваш второй фрагмент кода без ToList
этого — просто запрос. Вам нужно выполнить итерацию, чтобы фактически выполнить его. Вызов ToList
выполняет исходный запрос, и поскольку в вашем Select
вы изменяете свойство объекта, вы видите эффект (или побочный эффект) в вашем исходном списке. Это связано с передачей параметров в C #. Поскольку ваше лямбда-выражение в Select
является анонимным методом, который получает объект параметра списка. Позже, когда вы измените одно из его свойств, вы увидите эффект.
Аналогично, если вы попытаетесь установить объект null
, вы не увидите побочного эффекта.
.Select(x => x = null).ToList();