c# - 在多个数组中找到最常见的元素组合

标签 c# arrays

我有几个数组,比如:

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();

这里的逻辑是:

  1. 首先找到任意数组中的所有不同项
  2. 然后找到每对要搜索的项目
  3. 获取每一对,按包含该对的数组列表分组
  4. 按照包含每对的数组数量降序排列
  5. 返回第一对

关于c# - 在多个数组中找到最常见的元素组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19981046/

相关文章:

c# - onclick 第二次点击

c# - 从 ajax 调用填充多个下拉列表

JavaScript:如何在数组中存储对象?

c# - 查找双数组中的最大数

c# - C#更改枚举中的项目的int值

c# - MSChart Y 轴和 X 轴标签

PHP:忽略键并提取数组的值

c++ - 为什么 <const char*> 和 <const char[]> 有非常不同的内存或指针行为?

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

c# 将字符串作为代码执行