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

时间:2009-05-18 13:28:00

标签: vb.net linq

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

list1 = From t In list1 Where Not list2.Contains(t.column1)

这给了我错误:

Value of type 'Integer' cannot be converted to '<anonymous type>'

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

3 个答案:

答案 0 :(得分:7)

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

所说的是List<T>.Contains对于你检查的每个项目都是O(n)。如果list2可能非小,您可能希望创建HashSet<T> - 那么每次Contains来电都会快得多。

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

编辑:如果您正在使用LINQ to Objects,那么tvanfosson的解决方案适用于您,那么您就有了潜在的性能优势。最好(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)

答案 1 :(得分:6)

查看。Except()扩展方法,并结合投影:

list1 = list1.Except(list2.Select(Function(l) l.ID))

答案 2 :(得分:6)

你尝试过这样的事吗?

list1 = From t In list1 Where Not list2.Any(l => t.column1 = l.column1 AndAlso t.column2 = l.column2)

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