Лямбда-выражения - задайте значение одного свойства в коллекции объектов на основе значения другого свойства в коллекции - PullRequest
9 голосов
/ 26 мая 2010

Я новичок в лямбда-выражениях и собираюсь использовать синтаксис для установки значения одного свойства в коллекции на основе другого значения в коллекции

Обычно я делаю цикл:

class Item
{
    public string Name { get; set; }
    public string Value { get; set; }
}

void Run()
{
    Item item1 = new Item { Name = "name1" };
    Item item2 = new Item { Name = "name2" };
    Item item3 = new Item { Name = "name3" };

    Collection<Item> items = new Collection<Item>() { item1, item2, item3 };

    // This is what I want to simplify.
    for (int i = 0; i < items.Count; i++)
    {
        if (items[i].Name == "name2")
        {
            // Set the value.
            items[i].Value = "value2";
        }
    }
}

1 Ответ

16 голосов
/ 26 мая 2010

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, потому что это также проясняет, что вы делаете какую-то мутацию - и полезно легко увидеть этот факт в коде.

...