2017-08-30 68 views
2

我想比较三个列表,并从这些列表中尝试查找唯一元素。比较三个列表

作为一个例子:

List A: 1 
List B: 1, 2 
List C: 1, 2, 3 

其结果,元件 “3” 应该被存储。

我都看在以前的问题和扩大企图是:

Dim result1 As List(Of Long) = A.Except(B).ToList() 
Dim result2 As List(Of Long) = C.Except(result1).ToList() 

我所面临的问题是我的名单可能是这样:

List A: 1 
List B: 1 
List C: 1, 2 

结果,RESULT1会存储0与列表C相比较,然后存储在结果2中:1和2

是否可以同时比较三个列表? Microsoft上的除外文档仅列出2个列表。或者,我可以做一个预先检查,看看A和B是否相同,而不是比较它们,而是做一个3路比较。

回答

2

如何:

ListA 
    .Concat(ListB) 
    .Concat(ListC) 
    .GroupBy(Function(i) i) 
    .Where(Function(g) Not g.Skip(1).Any()) 
    .Select(Function(g) g.Key) 
+0

谢谢Magnus。我已经设法通过将你的代码放在一行上来实现它(VB不会识别新行,除非你使用_“) 由于缺乏点数而无法给它投票,但是给定它绿剔! – Aiden

0

有几种方法可以做到这一点...

Dim listOfLists = new List(Of List(Of Long))()From { _ 
    listA, _ 
    listB, _ 
    listC _ 
} 
Dim resultList = listOfLists.Aggregate(Function(previousList, nextList) previousList.Intersect(nextList).ToList()) 

乔恩斯基特有另一种方法,请参阅Intersection of multiple lists with IEnumerable.Intersect()(C#)

+0

我喜欢你的解决方案更好因为它更容易理解。只是有问题实施它。 我不得不对这两个变量进行修改,因为他们想要一个As子句,所以现在有这样的现在:Dim listOfLists As List(Of Long)= ... 但是我得到错误,例如“重载解析失败“由于运营商太多 – Aiden

+0

@Aiden我更新了我的答案。 –