有没有办法选择列表中未包含在另一个项目中的项目?例如:
list1 = From t In list1 Where Not list2.Contains(t.column1)
这给了我错误:
Value of type 'Integer' cannot be converted to '<anonymous type>'
这是有道理的,因为list2.Contains期望与list2相同的类型。但是,列表类型不同。我只想根据列比较进行选择。
答案 0 :(得分:7)
list2
实际包含什么?如果您可以准确地表达您的查询,我们可以在LINQ中表达它。如果不知道list1
,list2
和column1
是什么,很难提供帮助。
我 所说的是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)
我不确定它会有多高效,但我认为它应该适合你。