【问题标题】:issues on using mode in C#在 C# 中使用模式的问题
【发布时间】:2015-05-21 20:34:24
【问题描述】:

我的模式有问题,让我输入超过 10 个数字!

这是我的代码遇到的两个问题。

        public static void Main(string[] args)
        {

            int[] myNums = new int[10];
            int number = 0;
            int count = 0;
            Console.WriteLine("--Nmber Modifier--\n");
            Console.WriteLine("Entering a number that is no between 1 and 10 will end your process");
            do// limited to 10 HELP
            {
                number = Util.PromptForInt("Enter a number between 1 and 10 : ");
                if ((number <= 10) && (number >= 1))
                {
                    myNums[count] = number;
                }
                count++;
            }
            while ((number <= 10) && (number >= 1));
            Array.Sort(myNums);


            Console.WriteLine("Average number is : " + MeantAverage(myNums));
            Console.WriteLine("Largest Number is : " + LargestNum(myNums));
            Console.WriteLine("Smallest Number is : " + SmallestNum(myNums));
            Console.WriteLine("Most common number is : " + Mode(myNums));
            Console.ReadLine();
        }

        static double MeantAverage(int[] nums)
        {

            double dMeanAverage;
            double dSum = 0;
            var groups = nums.GroupBy(item => item);

            foreach (var group in groups)
            {
                dSum = group.Key + dSum;
            }

            dMeanAverage = dSum / nums[nums.Length - 1];
            return Math.Round(dMeanAverage, 2);
        }
        static int LargestNum(int[] nums)
        {
            int highestNum;
            highestNum = nums[nums.Length - 1];
            return highestNum;
        }
        static int SmallestNum(int[] nums)
        {

            int lowest = 0;

            for (int b = 0; b < nums.Length; b++)
            {
                if (nums[b] > lowest)
                {
                    lowest += nums[b];

                    return lowest;
                }
            } return lowest;
        }
        static int Mode(int[] nums)
        {
            // issues with mode
            int modes = 0;

            var modeGroup = nums.GroupBy(v => v);
            int max = modeGroup.Max(g => g.Count());
            modes = modeGroup.First(g => g.Count() == max).Key;
            return modes;
        }
    }
}

【问题讨论】:

    标签: c# mode


    【解决方案1】:

    稍微修改了代码,但意图是一样的。

    • 您忘记在 while 情况下检查 count
    • 您将在输入“0”时崩溃(对空数组没有安全防护)
    • 将模式更改为合并项目,然后降序排序

      var myNums = new List<int>(10);
      for(int i=0; i < 10; ++i)
      {
          int number = Utils.PromptForInt("Enter a number between 1 and 10 : ");
          if(number > 10 || number < 1)
              break;
          myNums.Add(number);
      }
      if(myNums.Count < 1)
          return; //no item input, do something
      
      myNums.Sort();
      Console.WriteLine("Average: {0}", myNums.Sum() / (double)myNums.Count);
      Console.WriteLine("Largest: {0}", myNums[myNums.Count - 1]);
      Console.WriteLine("Smallest: {0}", myNums[0]);
      
      var result = myNums.GroupBy(n => n)
                  .Select(c => new { Key = c.Key, total = c.Count() })
                  .OrderByDescending( a => a.total);
      Console.WriteLine("Most common: {0}, used {1} times", result.First().Key, result.First().total);
      

    【讨论】:

      【解决方案2】:

      您创建了一个包含十个数字的数组:

      int[] myNums = new int[10];
      

      因此,虽然您的 循环 不会因为您不检查 count 而将您限制为 10 个数字,但 系统 会这样做,因为只要您尝试访问第 10 个元素 (myNums[10]),您将获得 IndexOutOfRangeException

      由于您没有在任何地方捕获它,它只会终止您的程序。

      解决您的问题:

      • 检查count,以免输入太多数字!
      • 如果您需要可变长度集合,请使用为该集合构建的集合,例如 List&lt;T&gt;,而不是数组。数组是固定长度(大部分),而环绕的方式是对数组语义的严重滥用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-22
        • 1970-01-01
        • 1970-01-01
        • 2014-06-01
        相关资源
        最近更新 更多