C# - 检查一个值在数组中出现的次数并查找索引

C# - Check how many times a value appears in array and find indexes

我要写一个简单的程序,你必须输入学生的名字和他们的平均成绩,然后打印出最高的平均成绩和它属于谁。这里有几个主题是关于如何查找值是否出现在数组中的。我正在努力解决的问题是,如果平均成绩最高的学生超过 1 名,该怎么办。

这是我目前的情况:

        Console.WriteLine("Enter the overall count of students.");


        int stuCount = Convert.ToInt32(Console.ReadLine());
        string[] name = new string[stuCount];
        double[] avg = new double[stuCount];

        for (int i = 0; i < stuCount; i++)
        {
            Console.WriteLine("Enter the name of student # {0}.", i + 1);
            name[i] = Console.ReadLine();
            Console.WriteLine("Enter the average grade of {0}.", name[i]);
            avg[i] = Convert.ToDouble(Console.ReadLine());
        }

        // Finding the max average
        double maxAvg = avg[0];
        for (int i = 1; i < stuCount; i++)
        {
            if (avg[i] > maxAvg)
            {
                maxAvg = avg[i];
            }
        }

        // Displaying the max average
        Console.WriteLine("The highest average grade is {0}.", maxAvg);

那么,我可以使用 Array.IndexOf() 方法来查找多个索引吗?

谢谢。

考虑使用 class 来表示成绩;

class Grade {
    public String Name {get;set;}
    public double Average {get;set;}
}

那么你的代码可以更像;

Console.WriteLine("Enter the overall count of students.");

        int stuCount = Convert.ToInt32(Console.ReadLine());         

        List<Grade> allGrades = new List<Grade>();

        for (int i = 0; i < stuCount; i++)
        {
            Console.WriteLine("Enter the name of student # {0}.", i + 1);
            var name = Console.ReadLine();
            Console.WriteLine("Enter the average grade of {0}.", name[i]);
            var avg = Convert.ToDouble(Console.ReadLine());
            Grade current = new Grade(){
                Name = name, 
                Average = avg
            };
            allGrades.Add(current);
        }

        // Finding the max average
        double maxAvg = allGrades.Max(g => g.Average);
        var highestGrades = allGrades.Where(g => g.Average == maxAvg);

        Console.WriteLine("The following Student(s) have the highest average grade:");
        foreach(var grade in highestGrades){
                // Displaying the max average
                Console.WriteLine("Student: {0}. Grade: {1}.", grade.Name, grade.Average);
        }
}

找到最高平均值后,只需再次遍历平均值数组以查看哪些是最大值并使用索引打印螺柱。

Console.WriteLine("The highest average grade is {0}.", maxAvg);

Console.WriteLine("The students with this average grade are");
        for (int i = 0; i < stuCount; i++)
        {
            if (avg[i] == maxAvg)
            {
                 Console.WriteLine(name[i]);
            }
        }

另一种方法是创建一个包含两个属性(nameaverage grade)的 class,然后生成一个 List 并将其填入 for循环。下一步是 order by descending 列表通过 average grade 和 select 前 N 个元素相等。之后,您可以使用 ForEach

简单地打印结果