2008-10-28 167 views
3

我有兩個集合(泛型列表),我們稱它們爲ListA和ListB。從另一個集合中的一個集合中刪除項目

在ListA中,我有幾個A類型的項目。在ListB中,我有一些類型B的項目與ListA中的項目具有相同的ID(但類型不同),還有更多。我想從ListB中刪除與ListA中ID相同的所有項目。這樣做的最好方法是什麼? Linq是否反對很合適?你會用什麼算法?

利斯塔:ItemWithID1,ItemWithID2¨

數組listB:ItemWithID1,ItemWithID2,ItemWithID3,ItemWithID4

編輯:我忘了我原來的問題一提的是利斯塔和數組listB不含相同的類型。所以比較它們的唯一方法是通過.Id屬性。這使我到目前爲止的答案無效。

回答

3

我發現lambda表達式是完美的搭配。而是一個長期的LINQ to對象的方法,我可以用拉姆達做到在短短的幾行:

foreach(TypeA objectA in listA){ 
    listB.RemoveAll(objectB => objectB.Id == objectA.Id); 
} 
0

簡單的循環:

for (item i: LISTA) { 
    removeItem(i, LISTB); 
} 


method removeItem(Item, List) { 
    for (Item i: List) { 
     if (Item == i) 
      List.removeItem(i); 
    } 
} 
0

我不知道這是最好的選擇,但如果你刪除了在數組listB利斯塔的所有元素,簡單地遍歷利斯塔如果ListB.contains使用構建,從ListB中刪除它。

像這樣的事情

foreach Object o in ListA 
    If ListB.contains(o) 
    ListB.remove(o) 
12

這裏有兩個選項。不知道哪一個更快。

listB.RemoveAll(listA.Contains); 


foreach (string str in listA.Intersect(listB)) 
    listB.Remove(str); 
0

東西基準可用與C5 Generic Collection Library爲.NET是RemoveAll方法,就像由託德·懷特之前指定。然而,C5還提供了另一種方法,它的接口,其中RetainAll確實在該RemoveAll功能相反,使用原作者的名單,

ListB.RetainAll(ListA)是集{ Item1, Item2 },而ListB.RemoveAll(ListA)是集{ Item3, Item4 }

1

我認爲最合適的方法是Microserf的

大部分上面的例子是對的情況,其這兩個列表是相同的類型。 但是如果你想比較不同類型的ID並想刪除它們,最好的方法就是Microserf的方式。

謝謝

相關問題