如果你确定每个数组中的项目只出现一次,那么你可以把它们连接在一起并计算数量,例如:
var arrs = new[] { arr1, arr2, arr3, arr4, arr5, arr6 };
var intermediate = arrs.SelectMany(a => a)
.GroupBy(x => x)
.Select(g => new { g.Key, Count = g.Count() })
.OrderByDescending(x => x.Count);
var maxCount = intermediate.First().Count;
var results = intermediate.TakeWhile(x => x.Count == maxCount);
或者如果您更喜欢查询语法,那么可以写成:
var arrs = new[] { arr1, arr2, arr3, arr4, arr5, arr6 };
var intermediate =
from a in arrs.SelectMany(a => a)
group a by a into g
orderby g.Count() descending
select new { g.Key, Count = g.Count() };
var maxCount = intermediate.First().Count;
var results = intermediate.TakeWhile(x => x.Count == maxCount);
结果集将包含3个项目:
Key, Count
"A", 4
"B", 4
"D", 4
更新
根据您更新的问题,类似以下的解决方案应该可以实现:
var items = arrs.SelectMany(a => a).Distinct();
var pairs =
from a in items
from b in items
where a.CompareTo(b) < 0
select new { a, b };
var results =
(from arr in arrs
from p in pairs
where arr.Contains(p.a) && arr.Contains(p.b)
group arr by p into g
orderby g.Count() descending
select g.Key)
.First();
这里的逻辑是:
- 首先找到任何数组中的所有不同项
- 然后查找每个项的每个配对
- 获取每个配对,按包含该配对的数组列表分组
- 按包含每个配对的数组数降序排序各组
- 返回第一个配对