2012-02-07 44 views
2

怎麼能轉換爲LINQ或謂詞表達式如下代碼:LINQ查詢形式

List<int> list1 = new List<int> {1,2,3,4,5}; 
List<int> list2= new List<int> {2,3,4,5,6,7}; 
foreach (int int1 in list1) 
list2.Remove(int1); 
+2

IEnumerable.Except()。 – 2012-02-07 18:57:49

回答

0

你可以做這樣的事情:

list1.ForEach(x => { list2.Remove(x); }); 
9

您可以使用Except()

list2 = list2.Except(list1) 
      .ToList(); 

這也將執行比你原來的代碼更好,因爲你的代碼是O(n )對第一個集合中的所有項目進行循環,然後嘗試查找第二個集合中的第一個匹配項。 (雖然承認,如果你的收藏品很小,性能差異並不重要,但對於大型收藏品來說這將會很重要)。

Except()將在內部創建list1HashSet<int>,然後只是遍歷list2集合。只有HashSet中未包含的項纔會在結果枚舉中結束 - 因爲HashSet查找的平均值爲O(1),所以總共將導致O(n)的努力。

對於教育複習,請參閱Jon Skeets EduLinq系列,這裏的chapter for Except

+0

+1感謝您的精彩解釋。我每天都會在SO上學到新東西。 – 2012-04-12 13:10:16

1
list2.RemoveAll(m=>list1.Contains(m));