簡體   English   中英

從另一個集合中的一個集合中刪除項目

[英]Deleting items from one collection in another collection

我有兩個集合(通用列表),我們稱之為ListA和ListB。

在ListA中,我有一些類型為A的項目。在ListB中,我有一些類型B的項目具有與ListA中的項目相同的標識(但不是同一類型),還有更多項目。 我想刪除ListB中與ListA中ID相同的所有項目。 這樣做的最佳方法是什么? Linq對象很合適嗎? 你會用什么算法?

ListA:ItemWithID1,ItemWithID2¨

ListB:ItemWithID1,ItemWithID2,ItemWithID3,ItemWithID4

編輯:我忘記在原始問題中提到ListA和ListB不包含相同的類型。 因此,比較它們的唯一方法是通過.Id屬性。 這使我到目前為止得到的答案無效。

這有兩個選擇。 不確定哪一個更快。

listB.RemoveAll(listA.Contains);


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

我發現lambda表達式是一個完美的匹配。 而不是一個長的linq到對象方法,我可以用lambda只用幾行:

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

我認為最合適的方法是Microserf

上面的大多數示例都適用於兩個列表屬於同一類型的情況。 但是如果你想比較不同類型的Id並希望刪除它們,最好的方法是Microserf的方式。

謝謝

簡單循環:

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


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

我不知道這是最好的選擇,但是如果要刪除ListB中ListA的所有元素,只需迭代ListA並使用if ListB.contains構造,將其從ListB中刪除。

像這樣的東西

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

C5 Generic Collection Library for .NET提供的參考資料是RemoveAll方法,正如之前Todd White所指定的那樣。 但是,C5還在其接口中提供了另一種方法, RetainAllRemoveAll的功能相反,使用原作者的列表,

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM