Ответ 1
Вы можете использовать ForEach
, но сначала нужно преобразовать IEnumerable<T>
в List<T>
.
list.Where(w => w.Name == "height").ToList().ForEach(s => s.Value = 30);
У меня есть список (где T - пользовательский класс, а класс имеет некоторые свойства). Я хотел бы знать, как изменить одно или несколько значений в нем, используя выражения Lambda Expressions, поэтому результат будет таким же, как и следующий цикл foreach:
ПРИМЕЧАНИЕ: список содержит несколько элементов внутри (несколько строк)
foreach (MyClass mc in list)
{
if (mc.Name == "height")
mc.Value = 30;
}
И этот запрос linq (с использованием выражений Lambda), но не тот, что и верхний цикл foreach, возвращает только один элемент (одна строка) из списка!
Я хочу, чтобы он возвращал все элементы (все строки) и ТОЛЬКО chnages соответствующий (элементы, указанные в методах (расширениях) расширения WHERE.
list = list.Where(w => w.Name == "height").Select(s => { s.Value = 30; return s; }).ToList();
ПРИМЕЧАНИЕ: эти два примера не совпадают! Повторяю, linq возвращает только 1 элемент (одна строка), и это то, чего я не хочу, мне нужны все элементы из списка (например, цикл foreach, он только делает изменения, но не удаляет какой-либо элемент).
Вы можете использовать ForEach
, но сначала нужно преобразовать IEnumerable<T>
в List<T>
.
list.Where(w => w.Name == "height").ToList().ForEach(s => s.Value = 30);
Я бы, вероятно, пошел с этим (я знаю его не чистый linq), сохраните ссылку на исходный список, если вы хотите сохранить все элементы, и вы должны найти обновленные значения:
foreach (var mc in list.Where(x => x.Name == "height"))
mc.Value = 30;
Вы можете использовать проекцию с оператором lambda, но исходный цикл foreach
более читабельен и редактирует список вместо него, а не создает новый список.
var result = list.Select(i =>
{
if (i.Name == "height") i.Value = 30;
return i;
}).ToList();
Метод расширения
public static void SetHeights(this IEnumerable<MyClass> source, int value)
{
foreach (var item in source)
{
if (item.Name == "height")
{
item.Value = value;
}
yield return item;
}
}
var result = list.SetHeights(30).ToList();
Как насчет list.Find(x => x.Name == "height").Value = 20;
Это прекрасно работает. Я знаю его старый пост, но просто задавался вопросом, почему никто не предложил это? Есть ли недостаток в этом коде?
Вы можете сделать что-то вроде этого:
var newList = list.Where(w => w.Name == "height")
.Select(s => new {s.Name, s.Value= 30 }).ToList();
Но я предпочел бы использовать foreach
, потому что LINQ
предназначен для запросов, пока вы
хотите редактировать данные.