Linq - 从不同列表类型中排除项目

Dan*_*iel 4 linq vb.net

有没有办法在列表中选择未包含在另一个中的项目?例如:

list1 = From t In list1 Where Not list2.Contains(t.column1)
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

Value of type 'Integer' cannot be converted to '<anonymous type>'
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为list2.Contains期望与list2相同的类型.但是,列表类型不同.我只想根据列比较进行选择.

Jon*_*eet 7

list2实际上包含什么?如果您可以准确地表达您的查询,我们可以在LINQ中表达它.不知道什么list1,list2并且column1很难提供帮助.

说的是,List<T>.Contains将是为O(n)为您检查每个项目.如果list2可能是非小的,你可能想要创建一个HashSet<T>- 然后每个Contains调用将更快.

但话说回来,当我们对情况了解得更多时,我们可能会提出完全不同的解决方案.请尽可能具体地提出问题以获得最佳答案.

编辑:如果tvanfosson的解决方案适合您,如果您正在使用LINQ to Objects,那么您可能会遇到潜在的性能问题.最好(IMO)进行list2 一次投影并构建一组:

Dim invalid = New HashSet(Of Integer)(list2.Select(Function(x) x.Id))
list1 = From t in list1 Where Not invalid.Contains(t.column1)
Run Code Online (Sandbox Code Playgroud)


Joe*_*orn 6

看着那(这 .Except()扩展方法,结合投影:

list1 = list1.Except(list2.Select(Function(l) l.ID))
Run Code Online (Sandbox Code Playgroud)


Rya*_*saw 6

你尝试过这样的事吗?

list1 = From t In list1 Where Not list2.Any(l => t.column1 = l.column1 AndAlso t.column2 = l.column2)
Run Code Online (Sandbox Code Playgroud)

我不确定它会有多高效,但我认为它应该适合你.