2013-01-07 165 views
9

我有兩個列表。我想從LIST1中刪除任何不在LIST2中的項目。LINQ比較兩個列表並刪除

因此,例如:

 var list1 = new List<DownloadTask>(); 
     list1.Add(new DownloadTask{ OperationID = 1, MachineID = 1 }); 
     list1.Add(new DownloadTask{ OperationID = 2, MachineID = 1 }); 
     list1.Add(new DownloadTask{ OperationID = 3, MachineID = 1 }); 
     list1.Add(new DownloadTask{ OperationID = 3, MachineID = 2 }); 

     var list2 = new List<DownloadTask>(); 
     list2.Add(new DownloadTask{ OperationID = 1, MachineID = 1 }); 
     list2.Add(new DownloadTask{ OperationID = 3, MachineID = 2 }); 

運行list1後應該只包含項目:與組合operationId = 1machineId = 1OperationId = 3MachineId =2

+0

換句話說,你想找出這兩個列表中的一組共同元素。 – user3454439

回答

13

是否DownloadTask覆蓋EqualsGetHashCode是否正確?如果是這樣,所有你需要的是:

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

這就是如果你很樂意創建一個新的列表,當然。如果你真的想從現有的列表中刪除它們,它會稍微困難一些。這將很可能是最簡單的工作出來的結果應該是什麼樣子,然後清除並重新添加:

var newList = list1.Intersect(list2).ToList(); 
list1.Clear(); 
list1.AddRange(newList); 

當然,這一切確實要求您在DownloadTask適當地實現平等的 - 但如果你還沒有這樣做,這聽起來像這樣做是個好主意。 (或者至少實現IEqualityComparer<DownloadTask>的地方 - 你可以通過一個比較器對Intersect

作爲一個方面說明,我認爲「只保留元素list1這也是list2」(即交叉口)作爲一個更簡單的方法看看問題比「從list1哪些不在list2」中刪除所有元素「 - 後者基本上是一個雙重否定,這總是有點痛苦。

16

我覺得應該是:

list1.RemoveAll(x => list2.Exists(y => y.OperationID == x.OperationID && y.MachineID == x.MachineID)); 
+0

謝謝,真正滿意的代碼行... – Avishek

5
var lst = (from lst1 in list1 
      where !list2.Any(
           x => x.OperationID == lst1.OperationID && 
            x.MachineID == lst1.MachineID) 
      select lst1).ToList(); 

    list1 = lst.ToList(); 

請嘗試這個它應該工作。

+0

It's Works ... Thnak you ..... –