代码之家  ›  专栏  ›  技术社区  ›  Daniel Sam

LINQ-排除不同列表类型的项

  •  4
  • Daniel Sam  · 技术社区  · 16 年前

    是否有任何方法可以选择不包含在其他列表中的项目?例如:

    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 回复  |  直到 16 年前
        1
  •  6
  •   Ryan Versaw    16 年前

    你试过这样的吗?

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

    我不确定它的效率如何,但我认为它应该对你有用。

        2
  •  7
  •   Jon Skeet    16 年前

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

    我什么 说的是 List<T>.Contains 对于你检查的每个项目都是O(N)。如果 表2 可能是非小的,您可能希望创建一个 HashSet<T> 然后每个 Contains 打电话会快很多。

    但同样,当我们了解更多情况时,我们可能会提出一个完全不同的解决方案。请尽可能具体地回答这个问题,以得到最佳答案。

    编辑:如果Tvanfosson的解决方案对您有效 如果你使用linq-to对象,你会有一个潜在的性能缺陷。最好是在 表2 一旦 并建立一个集合:

    Dim invalid = New HashSet(Of Integer)(list2.Select(Function(x) x.Id))
    list1 = From t in list1 Where Not invalid.Contains(t.column1)
    
        3
  •  6
  •   Joel Coehoorn    16 年前

    看看。 Except() 延伸法,结合投影:

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