Lambda表达式 - 根据集合中另一个属性的值设置对象集合中的一个属性的值

时间:2010-05-26 19:05:05

标签: .net-4.0 c#-4.0 lambda expression

我是lambda表达式的新手,希望利用语法根据集合中的另一个值设置集合中一个属性的值

通常我会做一个循环:

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 个答案:

答案 0 :(得分:16)

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是仅适用于List<T>类型的.NET 2.0功能 - 不适用于所有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循环,因为这也说明你正在做一些变异 - 而且在代码中很容易看到这个事实。