C#试图找到阵列中出现次数最多的数字的函数不起作用

时间:2018-01-21 13:49:02

标签: c# arrays function for-loop

好的,所以我试图创建一个能够查看数字数组并返回最多出现的数字的函数。我尝试通过设置计数器和for循环来做到这一点,但每次运行它时总是返回值9,即使它不在那里。

public static int ModalNumber(int[] numbers)
{
int ones = 0;
int twos = 0;
int threes = 0;
int fours = 0;
int fives = 0;
int sixes = 0;
int sevens = 0;
int eights = 0;
int nines = 0;
int zeroes = 0;
for (int i = 0; i < 10; i++)
  {
    if (numbers[i] == 0)
      {
        zeroes++;
      }
    else if (numbers[i] == 1)
      {
        ones++;
      }
    else if (numbers[i] == 2)
      {
        twos++;
      }
    else if (numbers[i] == 3)
      {
        threes++;
      }
    else if (numbers[i] == 4)
      {
        fours++;
      }
    else if (numbers[i] == 5)
      {
        fives++;
      }
    else if (numbers[i] == 6)
      {
        sixes++;
      }
    else if (numbers[i] == 7)
      {
        sevens++;
      }
    else if (numbers[i] == 8)
      {
        eights++;
      }
    else if (numbers[i] == 1)
      {
        nines++;
      }
  }
  if (Convert.ToBoolean(zeroes >> ones & twos & threes & fours & fives & sixes & sevens & eights & nines))
    {
      return 0;
    }
  else if (Convert.ToBoolean(ones >> zeroes & twos & threes & fours & fives & sixes & sevens & eights & nines))
    {
      return 1;
    }
  else if (Convert.ToBoolean(twos >> zeroes & ones & threes & fours & fives & sixes & sevens & eights & nines))
    {
      return 2;
    }
  else if (Convert.ToBoolean(threes >> zeroes & ones & twos & fours & fives & sixes & sevens & eights & nines))
    {
      return 3;
    }
  else if (Convert.ToBoolean(fours >> zeroes & ones & twos & fours & fives & sixes & sevens & eights & nines))
    {
      return 4;
    }
  else if (Convert.ToBoolean(fives >> zeroes & ones & twos & threes & fours & sixes & sevens & eights & nines))
    {
      return 5;
    }
  else if (Convert.ToBoolean(sixes >> zeroes & ones & twos & threes & fours & fives & sevens & eights & nines))
    {
      return 6;
    }
  else if (Convert.ToBoolean(sevens >> zeroes & ones & twos & threes & fours & fives & sevens & eights & nines))
    {
      return 7;
    }
  else if (Convert.ToBoolean(eights >> zeroes & ones & twos & threes & fours & fives & sixes & sevens & nines))
    {
      return 8;
    }
  else
    {
      return 9;
    }

我事先抱歉这是多么奇怪,但基本上这个功能使用了一个由任何人使用该程序输入的数字数组 - 我知道这不是问题所在因为我写了一些代码,在程序运行时显示它。任何人都可以提出一种工作方式或更高效的方法吗?感谢

3 个答案:

答案 0 :(得分:4)

这应该可以使用LINQ来选择数组中最常出现的数字:

numbers.GroupBy(i => i).OrderByDescending(group => group.Count()).First().Key;

在处理数组,列表或序列时,我建议尝试考虑基于集合的操作需要做什么,因为它通常会简化解决方案。在这种情况下,您需要将数组中的不同值与它们出现的次数相关联,然后选择具有最大出现次数的值。这可以通过将整数集合在其标识(GroupBy(i => i))上,然后计算每个组中的出现次数(group => group.Count()),按计数降序排序,并取第一个元素来完成

以防万一,因为你实际上说&#34;返回最多出现的数字&#34;,如果你真的想要数字而不是最常出现的数字,你可以相应地更改解决方案:

numbers.SelectMany(i => i.ToString().Select(c => Int32.Parse(c.ToString())))
    .GroupBy(i => i).OrderByDescending(group => group.Count())
    .First()
    .Key;

答案 1 :(得分:1)

基本上,我就是这样做的(我不打算给你代码,因为它显然是功课):

  • 为可能的条目数创建一个数组(当有十种可能时,int[10])。一个更好的选择是存储计数的字典,但我们现在将采用简单的方法。
  • 对于每个数字,增加刚刚创建的数组中的数字值(如果要增加值9的已找到项目数,则设置数组[9]。)
  • 遍历数组,并记住您找到最高数字的索引。您还必须存储该最高编号作为下一次检查的参考点。

答案 2 :(得分:0)

不想为你做功课,但我已经有了这个

static int Most(int[] numbers)
{
    int[] count = new int[10];
    foreach (int n in numbers)
    {
        if (n > 9 || n < 0)
            throw new ArgumentOutOfRangeException();
        count[n]++;
    }
    int max = count[0];
    int maxP = 0;
    for(int p = 1; p < 10; p++)
    {                
        if (count[p] > max)
        {
            max = count[p];
            maxP = p;
        }
    }
    return maxP;
}