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

时间:2008-10-28 18:55:08

标签: c# .net collections linq-to-objects

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

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

实施例

ListA:ItemWithID1,ItemWithID2¨

ListB:ItemWithID1,ItemWithID2,ItemWithID3,ItemWithID4

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

6 个答案:

答案 0 :(得分:12)

以下是两个选项。不确定哪一个更快。

listB.RemoveAll(listA.Contains);


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

答案 1 :(得分:3)

我发现lambda表达式是一个完美的匹配。而不是长linq to objects方法,我可以用lambda:

在几行中完成
foreach(TypeA objectA in listA){
    listB.RemoveAll(objectB => objectB.Id == objectA.Id);
}

答案 2 :(得分:1)

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

上面的大多数示例都适用于两个列表属于同一类型的情况。 但是如果你想比较不同类型的Id并希望删除它们,最好的方法是Microserf的方式。

由于

答案 3 :(得分:0)

简单循环:

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


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

答案 4 :(得分:0)

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

像这样的东西

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

答案 5 :(得分:0)

适用于.NET的C5 Generic Collection Library提供的参考资料是RemoveAll方法,正如Todd White之前指定的那样。但是,C5还在其接口RetainAll中提供了另一种方法,它使用原作者的列表,与RemoveAll的功能相反,

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