我有两个集合(通用列表),我们称之为ListA和ListB。
在ListA中我有一些类型为A的项目。在ListB中,我有一些类型B的项目具有与ListA中的项目相同的SAME ID(但不是同一类型),还有更多。我想删除ListB中与ListA中ID相同的所有项目。这样做的最佳方法是什么? Linq对象很合适吗?你会用什么算法?
实施例
ListA:ItemWithID1,ItemWithID2¨
ListB:ItemWithID1,ItemWithID2,ItemWithID3,ItemWithID4
编辑:我忘记在原始问题中提到ListA和ListB不包含相同的类型。因此,比较它们的唯一方法是通过.Id属性。这使我到目前为止所获得的答案无效。答案 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 }
。