Логика обновления списка объектов с помощью linq

#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();