如何在vb.net中使用lambda删除指定列表项

如何在vb.net中使用lambda删除指定列表项,vb.net,lambda,Vb.net,Lambda,有这样的情况。 有两个列表:list1asList(整型)和list2asList(整型) 我需要删除列表1中与列表2中的项目相同的所有项目 例如: list1 = 0, 1, 2, 3, 6, 10 list2 = 3, 6 从列表1中删除列表2后:list1=0,1,2,10 list1.RemoveAll(Function(i) list2.Contains(i)) 或者只是和代表在一起 list1.RemoveAll(AddressOf list2.Contains) 正如Meta

有这样的情况。 有两个列表:
list1
as
List(整型)
list2
as
List(整型)

我需要删除列表1中与列表2中的项目相同的所有项目

例如:

list1 = 0, 1, 2, 3, 6, 10
list2 = 3, 6
从列表1中删除列表2后:
list1=0,1,2,10

list1.RemoveAll(Function(i) list2.Contains(i))
或者只是和代表在一起

list1.RemoveAll(AddressOf list2.Contains)
正如Meta Knight所指出的,如果
list2
只是一个查找列表,无论如何都不能包含重复项,那么最好使用
HashSet(Int32)
。它有一个
O(1)
查找复杂度,这与它的大小无关,如果您还需要
list2
,它的缺点是需要更多内存

您可以轻松创建一个:

Dim setOfNums = new HashSet(Of Int32)(list2)
list1.RemoveAll(AddressOf setOfNums.Contains)

+1.如果列表中有许多项,那么list2应该是一个哈希集,以便更快地查找。其余的代码将保持不变。@Meta Knight:谢谢,编辑了我的答案以将其包括在内。如果
list1
中可以包含重复项,则该选项无效,如
{0,1,2,3,6,1}
。结果将是
{0,1,2}
,而不是
{0,1,2,1}
。还需要创建新集合并将其分配给旧集合。
list1 = list1.Except(list2).ToList();