Подтвердить что ты не робот

Измените значение внутри списка <T>

У меня есть список (где 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, он только делает изменения, но не удаляет какой-либо элемент).

4b9b3361

Ответ 1

Вы можете использовать ForEach, но сначала нужно преобразовать IEnumerable<T> в List<T>.

list.Where(w => w.Name == "height").ToList().ForEach(s => s.Value = 30);

Ответ 2

Я бы, вероятно, пошел с этим (я знаю его не чистый linq), сохраните ссылку на исходный список, если вы хотите сохранить все элементы, и вы должны найти обновленные значения:

 foreach (var mc in list.Where(x => x.Name == "height"))  
     mc.Value = 30;

Ответ 3

Вы можете использовать проекцию с оператором 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();

Ответ 4

Как насчет list.Find(x => x.Name == "height").Value = 20; Это прекрасно работает. Я знаю его старый пост, но просто задавался вопросом, почему никто не предложил это? Есть ли недостаток в этом коде?

Ответ 5

Вы можете сделать что-то вроде этого:

var newList = list.Where(w => w.Name == "height")
              .Select(s => new {s.Name, s.Value= 30 }).ToList();

Но я предпочел бы использовать foreach, потому что LINQ предназначен для запросов, пока вы хотите редактировать данные.