Dot-Net-4.0
Lambda 表達式 - 根據集合中另一個屬性的值設置對象集合中一個屬性的值
我是 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 方法一樣)。如果你喜歡這種方法,你可以實現ForEachforIEnuerable<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循環,因為這也清楚地表明你正在做一些突變 - 在程式碼中輕鬆地看到這個事實很有用。