获取2个列表之间不匹配的所有成员

And*_*son 3 linq vb.net

我正在使用vb.net :(

我有2个列表集合,我想返回第3个集合,其中成员i 1集合不存在于另一个集合中.

所以,例如我有这个基本的类对象

Class Person
    Public Property FirstName As String
End Class
Run Code Online (Sandbox Code Playgroud)

我现在创建2个列表:

Dim l1 As List(Of Person) = New List(Of Person)()
Dim l2 As List(Of Person) = New List(Of Person)()

Dim p1 As Person = New Person()
p1.FirstName = "andy"
l1.Add(p1)

Dim p2 As Person = New Person()
p2.FirstName = "john"
l1.Add(p2)

Dim p3 As Person = New Person()
p3.FirstName = "david"
l2.Add(p3)

Dim p4 As Person = New Person()
p4.FirstName = "john"
l2.Add(p4)
Run Code Online (Sandbox Code Playgroud)

我想要的是获得这些条目的新列表:

andy
david
Run Code Online (Sandbox Code Playgroud)

到目前为止我有这个:

Dim newList = From c1 In l1, c2In l2
               Where c2.FirstName <> c1.FirstName
               Select c1.FirstName
Run Code Online (Sandbox Code Playgroud)

这给了我:

andy
andy
john
Run Code Online (Sandbox Code Playgroud)

我承认我的linq很棒....

oct*_*ccl 5

一种简单的方法是使用All扩展方法:

Dim newList = From c1 In l1
              Where l2.All(Function(c2) c2.FirstName <> c1.FirstName)
              Select c1.FirstName
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是使用Except扩展方法:

Dim newList=l1.Select(Function(c1) c1.FirstName).Except(l2.Select(Function(c2) c2.FirstName));
Run Code Online (Sandbox Code Playgroud)

更新:

我现在注意到你想要两个列表中的独占元素.您可以连接两个名称列表并稍后应用a GroupBy以仅获取一次出现的名称:

Dim newList=l1.Select(Function(c1) c1.FirstName).Concat(l2.Select(Function(c2) c2.FirstName))
           .GroupBy(Function(c) c)
           .Where(Function(g) g.Count()=1)
           .Select(Function(g) g.Key);
Run Code Online (Sandbox Code Playgroud)