5

我有两个集合(通用列表),我们称它们为 ListA 和 ListB。

在 ListA 中,我有一些 A 类型的项目。在 ListB 中,我有一些 B 类型的项目,它们的 ID 与 ListA 中的项目相同(但类型不同),还有更多。我想从 ListB 中删除与 ListA 中具有相同 ID 的所有项目。这样做的最佳方法是什么?Linq to objects 是不是很合适?你会使用什么算法?

例子

ListA:ItemWithID1,ItemWithID2¨

ListB:ItemWithID1、ItemWithID2、ItemWithID3、ItemWithID4

编辑:我忘了在我原来的问题中提到 ListA 和 ListB 不包含相同的类型。因此,比较它们的唯一方法是通过 .Id 属性。这使我到目前为止得到的答案无效。

4

6 回答 6

12

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

listB.RemoveAll(listA.Contains);


foreach (string str in listA.Intersect(listB))
  listB.Remove(str);
于 2008-10-28T19:06:29.557 回答
3

我发现 lambda 表达式是完美的匹配。我可以用 lambda 几行代码来代替长的 linq to objects 方法:

foreach(TypeA objectA in listA){
    listB.RemoveAll(objectB => objectB.Id == objectA.Id);
}
于 2008-11-04T15:16:16.613 回答
1

我认为最合适的方法是 Microserf 的

上面的大多数示例都是针对两个列表类型相同的情况。但是如果你想比较不同类型的 Id 并想删除它们最好的方法是 Microserf 的方法。

谢谢

于 2009-01-05T18:01:36.903 回答
0

简单循环:

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


method removeItem(Item, List) {
    for (Item i: List) {
        if (Item == i)
            List.removeItem(i);
    }
}
于 2008-10-28T19:01:09.117 回答
0

我不知道这是最好的选择,但是如果您要删除 ListB 中 ListA 的所有元素,只需遍历 ListA 并使用 if ListB.contains 构造,将其从 ListB 中删除。

像这样的东西

foreach Object o in ListA
  If ListB.contains(o)
    ListB.remove(o)
于 2008-10-28T19:01:53.623 回答
0

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

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

于 2008-10-29T04:40:34.797 回答