Dot-Net-4.0

Lambda 表達式 - 根據集合中另一個屬性的值設置對象集合中一個屬性的值

  • July 3, 2013

我是 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";
       }
   }
}

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 方法一樣)。如果你喜歡這種方法,你可以實現ForEachfor 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循環,因為這也清楚地表明你正在做一些突變 - 在程式碼中輕鬆地看到這個事實很有用。

引用自:https://stackoverflow.com/questions/2915922