如何从数组中获取多个最常见的值并将它们添加到另一个数组中?

6

我有一个如下的数组:

[2 1 2 4 3 3 1]

我正在使用这个...

var query = array.GroupBy(item => item)
    .OrderByDescending(g => g.Count())
    .Select(g => g.Key)
    .First();

..获取第一个最常见的值(在这种情况下为: 2)

如果我想获取多个值(在这种情况下为:2、3、1)呢?

我需要将这些值添加到另一个临时数组中,以检查 tempArray.Count 是否大于 1。


为什么2是最常见的值而不是3? - DavidG
对不起,翻译的内容有一点错误,请稍等。 - abecadlo37
1
现在我的问题是:为什么3是最常见的值而不是2?! - DavidG
2根据描述是正确的:第一个最常见的 - cahen
1
这真的很重要吗? - abecadlo37
3个回答

1
如果您想获取所有与最高计数相连的组,可以按照以下方式操作:
var tmp = array
   .GroupBy(item => item)
   .OrderByDescending(g => g.Count())
   .Select(g => new {
       Item = g.Key
   ,   Count = g.Count()
   }).ToList();
var res = tmp
    .TakeWhile(p => p.Count == tmp[0].Count)
    .Select(p => p.Item)
    .ToList();

注意,检查 tmp 列表计数是否非零是不必要的,因为只有在临时列表中至少有一个项时才执行 TakeWhile 条件。换句话说,当 tmp 为空时,lambda 条件 p => p.Count == tmp[0].Count 永远不会被触发,也不会抛出数组越界异常。

1
这是我的处理方法(为了清晰起见,将代码拆分):
//Basic query
var query = array
    .GroupBy(i => i);

//Get the maximum count number
var maxCount = query
    .Max(i => i.Count());

//Get all the values that have a count of maxCount
var result = query
    .Where(i => i.Count() == maxCount)
    .Select(i => i.Key);

0
如果你想要前三个结果:
var query = array.GroupBy(item => item)
  .OrderByDescending(g => g.Count())
  .Select(g => g.Key).Take(3);

在问题中最初没有明确指出他们只想返回并列前面的数字。 - Gav J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接