2012-10-20 24 views
33

我有一些列表(其中T是自定義類,而類有一些屬性)。 我想知道如何使用Lambda表達式來改變一個或多個值inide的,所以結果會是一樣的foreach循環波紋管:更改列表中的某些值<T>

注:列表裏面包含多個項目(多行)

 foreach (MyClass mc in list) 
     { 
      if (mc.Name == "height") 
       mc.Value = 30; 
     } 

這在LINQ查詢(使用Lambda表達式),但它的不一樣上foreach循環,它只是從列表返回1項(一行)!

我要的是,它返回的所有項目(所有行),只有chnages合適的一個(在WHERE extention方法中指定的項目

list = list.Where(w => w.Name == "height").Select(s => { s.Value = 30; return s; }).ToList(); 

注:這2例是不一樣的!我再說一遍,linq只返回1個項目(一行),這是我不想要的東西,我需要從列表中的所有項目(如foreach循環,它只做變化,但它不刪除任何物品)

+5

*爲什麼*你想使用lambda表達式? 'foreach'的代碼工作正常,很簡單。 LINQ用於*查詢*數據,而不是對它進行變異。 –

+1

根據定義,只返回匹配記錄。基本上:這不是你想要的 - 只是使用foreach –

+0

嗨,喬恩,我知道foreach循環如果擊球和更快,但我不想學習,這就是全部。對於一些「小」代碼將會很好。但重點主要在於學習。 –

回答

64

您可以使用ForEach,但必須首先將IEnumerable<T>轉換爲List<T>

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

這會創建一個新列表。它包含的項目名稱!=「高度」 – Tilak

+0

創建一個新列表 - 並僅返回基於WHERE子句的項目。不是我想要的例子。 –

+0

@MitjaBonca我不好,我誤解了你的問題。看到我上面的編輯。 – McGarnagle

2

你可以使用一個投影,並聲明拉姆達,但原來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(); 
+0

是否可以避免阻塞?也許定義選擇擴展方法? –

+0

是的,你可以定義一個自定義的擴展方法,但原始的foreach不那麼模糊和易於維護,並且不會創建一個可能代價高昂的新列表。 – devdigital

+0

我知道如何做一個cusom extemsion方法,我只是想知道是否有可能以「短」的方式做到這一點,關於代碼?!就像@羅賓所示的例子,只是他的代碼不起作用! –

-2

你可以做這樣的事情:

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

但我寧願選擇使用foreach因爲LINQ是用於查詢,而你 要編輯數據。

+0

我這一個trieed過過,但我有一個例外:「無效的匿名類型成員聲明匿名類型成員必須與成員分配,簡單名稱或成員訪問來聲明。」。這是爲「s.Value = 30」。 –

+0

不是我想要的例子,即使它不工作。 –

8

我可能會與此去(我知道它不是純LINQ),保持原來的列表的引用,如果你想保留的所有項目,你應該找到更新的值都在那裏:

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

如何list.Find(x => x.Name == "height").Value = 20; 這工作正常。我知道它是一箇舊帖子,但只是想知道爲什麼沒有人提出這個建議?這段代碼有什麼缺點?

+0

如果'list.Find(X => x.Name ==「高度」)'是返回任何結果,得到錯誤'[的NullReferenceException:未將對象引用設置到對象的實例]' –

+0

你總是可以做一個空在實際修改值之前檢查。 –

相關問題