如何使用lambda表达式在vb.net中删除列表的特定项

3

存在这样的情况:有两个列表:list1List(of Integer)list2 也是 List(of Integer)

我需要删除所有与 list2 中相同的 list1 中的项目。

例如:

list1 = 0, 1, 2, 3, 6, 10
list2 = 3, 6

将list2从list1中移除后:list1 = 0, 1, 2, 10

2个回答

5
list1.RemoveAll(Function(i) list2.Contains(i))

或者只使用委托
list1.RemoveAll(AddressOf list2.Contains)

正如Meta-Knight所指出的,如果list2只是一个查找列表,无论如何都不可能包含重复项,最好使用HashSet(Of Int32)。它具有O(1)的查找复杂度,与其大小无关,但如果你还需要list2,则需要更多的内存。您可以轻松创建一个:
Dim setOfNums = new HashSet(Of Int32)(list2)
list1.RemoveAll(AddressOf setOfNums.Contains)

如果您有许多项目的列表,则list2应该是一个HashSet,以便更快地查找。其余代码保持不变。 - Meta-Knight
@Meta-Knight:谢谢,我已经编辑了我的答案并包含了它。 - Tim Schmelter

0
list1 = list1.Except(list2).ToList();

如果list1中可能包含重复项,例如{0, 1, 2, 3, 6, 1},则此方法无法正常工作。结果将是{0, 1, 2}而不是{0, 1, 2, 1}。此外,需要创建一个新集合并将其分配给旧集合。 - Tim Schmelter

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