【发布时间】:2009-11-04 15:56:16
【问题描述】:
我有一个列表列表,我想找到这样的交集:
var list1 = new List<int>() { 1, 2, 3 };
var list2 = new List<int>() { 2, 3, 4 };
var list3 = new List<int>() { 3, 4, 5 };
var listOfLists = new List<List<int>>() { list1, list2, list3 };
// expected intersection is List<int>() { 3 };
有没有办法用 IEnumerable.Intersect() 做到这一点?
编辑:
我应该更清楚一点:我确实有一个列表列表,我不知道会有多少,上面的三个列表只是一个例子,我有的实际上是一个IEnumerable<IEnumerable<SomeClass>>
解决方案
感谢所有出色的答案。原来有四个选项可以解决这个问题:List+aggregate (@Marcel Gosselin), List+foreach (@JaredPar, @Gabe Moothart), HashSet +aggregate (@jesperll) 和 HashSet+foreach (@Tony the Pony)。我对这些解决方案进行了一些性能测试(改变列表数、每个列表中的元素数和随机数最大值大小。
事实证明,在大多数情况下,HashSet 比 List 表现更好(除了大列表和小随机数大小,因为我猜是 HashSet 的性质。) 我找不到 foreach 方法和聚合方法之间的任何真正区别(foreach 方法的性能略更好。)
对我来说,聚合方法确实很吸引人(我将其作为公认的答案),但我不会说它是最易读的解决方案。再次感谢大家!
【问题讨论】: