我有几个数组,比如:
var arr1 = new[] { "A", "B", "C", "D" };
var arr2 = new[] { "A", "D" };
var arr3 = new[] { "A", "B", };
var arr4 = new[] { "C", "D" };
var arr5 = new[] { "B", "C", "D" };
var arr6 = new[] { "B", "A", };
...等等
如何获得所有这些数组中最常见的元素组合?
在这种情况下,它是 A 和 B,因为它们出现在 arr1、arr3 和 arr6 中,而 C 和 D,因为它们出现在数组 arr1、arr4 和 arr5 中。
只需提及元素可以在任何类型的集合中,即。也在 ArrayLists 中。
更新 呃,我还不够清楚......数组中两个元素的最常见组合。这就是我试图在示例中展示的内容,但在我的问题中没有提及。
对不起 :-((
最佳答案
如果您确定每个项目在每个数组中只出现一次,您可以将它们连接在一起并获得计数,例如:
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();
这里的逻辑是:
- 首先找到任意数组中的所有不同项
- 然后找到每对要搜索的项目
- 获取每一对,按包含该对的数组列表分组
- 按照包含每对的数组数量降序排列
- 返回第一对
关于c# - 在多个数组中找到最常见的元素组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19981046/