C# 查找整数数组中前3个最大重复数的步骤

C# 查找整数数组中前3个最大重复数的步骤,c#,C#,我想找出整数数组中最大重复数的前3个 下面是我尝试过的一段代码,但找不到想要的结果: static void Main(string[] args) { int[,] numbers = { {1, 2, 0, 6 }, {5, 6, 7, 0 }, {9, 3, 6, 2 },

我想找出整数数组中最大重复数的前3个

下面是我尝试过的一段代码,但找不到想要的结果:

static void Main(string[] args)
    {

      int[,] numbers = {
                           {1, 2, 0, 6 },
                           {5, 6, 7, 0 },
                           {9, 3, 6, 2 },
                           {6, 4, 8, 1 }
                        };           
        int count = 0;
        List<int> checkedNumbers = new List<int>();
        foreach (int t in numbers)
        {
            if (!checkedNumbers.Contains(t))
            {
               foreach (int m in numbers)                   
               {
                   if (m == t)                        
                      {   
                         count++;
                      }
                }
                Console.WriteLine("Number {0} is Repeated {1} Times ", t, count);
               count = 0;
                checkedNumbers.Add(t);
            }           
       }
        Console.ReadLine();
    }
static void Main(字符串[]args)
{
整数[,]个数={
{1, 2, 0, 6 },
{5, 6, 7, 0 },
{9, 3, 6, 2 },
{6, 4, 8, 1 }
};           
整数计数=0;
List checkedNumbers=新列表();
foreach(整数t)
{
如果(!checkedNumbers.Contains(t))
{
foreach(整数m)
{
如果(m==t)
{   
计数++;
}
}
WriteLine(“数字{0}重复了{1}次”,t,count);
计数=0;
检查编号。添加(t);
}           
}
Console.ReadLine();
}
int[]数字={1,2,3,5,6,32,2,4,42,2,4,4,5,6,3,4};
var counts=新字典();
foreach(数值中的变量编号)
{
计数[数]=计数[数]+1;
}
var top3=counts.OrderByDescending(x=>x.Value)。选择(x=>x.Key)。获取(3);
提示:

您可以在LINQ的帮助下完成此操作。
这是查找最常见元素的代码:-

List<int> list = new List<int>() { 1,1,2,2,3,4,5 };

// group by value and count frequency
var query = from i in list
            group i by i into g
            select new {g.Key, Count = g.Count()};

// compute the maximum frequency
int frequency = query.Max(g => g.Count);

// find the values with that frequency
IEnumerable<int> modes = query
                              .Where(g => g.Count == frequency)
                              .Select(g => g.Key);

// dump to console
foreach(var mode in modes) {
    Console.WriteLine(mode);
}
List List=newlist(){1,1,2,2,3,4,5};
//按值和计数频率分组
var query=来自列表中的i
第i组由i变成g
选择新{g.Key,Count=g.Count()};
//计算最大频率
int frequency=query.Max(g=>g.Count);
//找到具有该频率的值
IEnumerable modes=查询
.其中(g=>g.计数==频率)
.选择(g=>g.Key);
//转储到控制台
foreach(模式中的var模式){
控制台写入线(模式);
}
以同样的方式,您也可以找到另外两个。

您可以使用from LINQ,然后根据每组中的计数:

var result = list.GroupBy(i => i)
                 .OrderByDescending(g => g.Count())
                 .Select(g => g.Key)
                 .Take(3);

编辑:对于您的代码,您可以使用类型为的
来展平矩阵,然后使用上面的代码:

int[,] numbers = {
                       {1, 2, 0, 6 },
                       {5, 6, 7, 0 },
                       {9, 3, 6, 2 },
                       {6, 4, 8, 1 }
                 };

var list = numbers.OfType<int>();
int[,]个数字={
{1, 2, 0, 6 },
{5, 6, 7, 0 },
{9, 3, 6, 2 },
{6, 4, 8, 1 }
};
var list=numbers.OfType();

我发现现有的答案都没有提供解释,所以我将尝试解释

您需要做的是计算每个项目在数组中出现的次数。为此,有多种方法(字典、linq等)。可能最容易使用包含数字的字典,以及数字出现的次数:

int numbers[] = {1, 3, 6, 10, 9, 3, 3, 1, 10} ;
Dictionary<int, int> dic = new Dictionary<int, int>();
如果字典不存在,它会自动添加一个新项目,因此我们只需执行
dic[i]++

接下来,我们需要得到最高的3个值。同样,有很多方法可以做到这一点,但最简单的方法是对其进行排序

var sorted_dic = dic.OrderByDescending(x => x.Value);
现在,
sorted\u dic
中的前3项将是您要查找的3个值。 有多种方法可以仅获取这3种,例如使用
Take
方法:

var first_3 = sorted_dic.Take(3);
现在,您可以迭代这3个值,例如在屏幕上打印它们:

foreach (var i in first_3)
{
    Console.Write("{0} appeared {1} times.", i.Key, i.Value);
}

我已经发布了我尝试过的代码。看一看,如果我做错了什么,就给我提建议。请用你的代码检查我的答案
var first_3 = sorted_dic.Take(3);
foreach (var i in first_3)
{
    Console.Write("{0} appeared {1} times.", i.Key, i.Value);
}