从一个集合中删除另一个集合的项目

5
我有两个集合(泛型列表),我们称它们为ListA和ListB。ListA中有一些类型为A的项目,而ListB中有一些类型为B的项目,这些项目与ListA中的项目具有相同的ID(但不是相同的类型),并且还有许多其他项目。我想要从ListB中删除所有与ListA中具有相同ID的项目。最好的方法是什么?Linq to objects是否适用?你会使用什么算法?
例如:
ListA: ItemWithID1, ItemWithID2
ListB: ItemWithID1, ItemWithID2, ItemWithID3, ItemWithID4
编辑:我忘记在原问题中提到ListA和ListB中不包含相同类型的内容。因此,唯一比较它们的方式是通过.Id属性,这使得迄今为止得到的答案无效。
6个回答

12

这里有两个选项,不确定哪一个更快。

listB.RemoveAll(listA.Contains);


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

3

我发现lambda表达式是完美的匹配。不再需要使用冗长的Linq to Objects方法,只需使用几行lambda表达式即可:

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

1

我认为最适合的方法是微软公司的。

上面大多数的例子都是针对两个列表类型相同的情况。但是,如果你想比较不同类型的ID并且想要删除它们,最好的方法是采用微软公司的方式。

谢谢。


0

简单循环:

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


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

0

我不知道这是最好的选择,但如果你要删除ListA中所有在ListB中的元素,可以简单地遍历ListA并使用if ListB.contains结构,将其从ListB中移除。

就像这样

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

0

在.NET中,C5通用集合库提供了一个RemoveAll方法,正如Todd White之前指定的那样,这是一个可供参考的内容。然而,C5还在其接口中提供了另一种方法RetainAll,它与RemoveAll的功能相反,即使用原始作者的列表,

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接