LINQ обычно более полезен для выбора данных, чем для изменения данных. Тем не менее, вы можете написать что-то вроде этого:
foreach(var item in items.Where(it => it.Name == "name2"))
item.Value = "value2";
Сначала выбираются элементы, которые необходимо изменить, а затем изменяются все из них с использованием стандартного императивного цикла. Вы можете заменить цикл foreach
на метод ForAll
, который доступен для списков, но я не думаю, что это дает вам какое-либо преимущество:
items.Where(it => it.Name == "name2").ToList()
.ForEach(it => it.Value = "value2");
Обратите внимание, что вам нужно добавить ToList
в середине, потому что ForEach
- это функция .NET 2.0, которая доступна только для типа List<T>
- не для всех типов IEnumerable<T>
(как другие методы LINQ). Если вам нравится этот подход, вы можете реализовать ForEach
для IEnuerable<T>
:
public static void ForEach<T>(this IEnumerable<T> en, Action<T> f) {
foreach(var a in en) f(a);
}
// Then you can omit the `ToList` conversion in the middle
items.Where(it => it.Name == "name2")
.ForEach(it => it.Value = "value2");
В любом случае, я бы предпочел цикл foreach
, потому что это также проясняет, что вы делаете какую-то мутацию - и полезно легко увидеть этот факт в коде.