[英]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還在其接口中提供了另一種方法, RetainAll
與RemoveAll
的功能相反,使用原作者的列表,
ListB.RetainAll(ListA)
是集合{ Item1, Item2 }
,而ListB.RemoveAll(ListA)
是集合{ Item3, Item4 }
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.