Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net Linq-排除来自不同列表类型的项_Vb.net_Linq - Fatal编程技术网

Vb.net Linq-排除来自不同列表类型的项

Vb.net Linq-排除来自不同列表类型的项,vb.net,linq,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相同的类型。但是,列表类型不同。我只想根据列比较进行选择。查看

有没有办法选择列表中不包含在其他列表中的项目?例如:

list1 = From t In list1 Where Not list2.Contains(t.column1)
这给了我一个错误:

Value of type 'Integer' cannot be converted to '<anonymous type>'
“整型”类型的值不能转换为“” 这是有道理的,因为list2.Contains需要与list2相同的类型。但是,列表类型不同。我只想根据列比较进行选择。

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

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

那么
list2
实际上包含什么呢?如果您可以精确地表达您的查询,我们可能可以用LINQ来表达它。如果不知道什么是
list1
list2
column1
是很难帮助的

我想说的是,对于您检查的每个项目,
List.Contains
都将是O(n)。如果
list2
可能不小,那么您可能需要创建一个
HashSet
——那么每个
包含的调用都会快得多

但话说回来,当我们更多地了解情况时,我们很可能会提出一个完全不同的解决方案。请把问题尽量具体化,以便得到最好的答案

编辑:如果tvanfosson的解决方案适合您,并且您正在使用LINQ to对象,那么您就有了一个潜在的性能陷阱。最好(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)

你试过这样的东西吗

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

我不确定它的效率有多高,但我认为它应该适合您。

Except仍然需要一个相同类型的列表进行比较。然后使用投影来映射它:list1.Except(list2.Select(…)有没有一种方法可以对多个列执行此操作?我不确定此答案如何满足最初的要求,即t.column1指定要排除的list1元素的部分。与往常一样,Jon Skeet用于linq win;)我喜欢它的优雅,我想它就快到了。但我得到了一个例外:“无法将'WhereListIterator
1[ToolObject]'类型的对象强制转换为'System.Collections.Generic.List
1[ToolObject]'。”是否在末尾抛出一个.ToList()?(在整个语句周围加括号)