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]);
}
}
另一种方法是创建一个包含两个属性(name
和 average grade
)的 class,然后生成一个 List
并将其填入 for
循环。下一步是 order by descending
列表通过 average grade
和 select 前 N 个元素相等。之后,您可以使用 ForEach
简单地打印结果
我要写一个简单的程序,你必须输入学生的名字和他们的平均成绩,然后打印出最高的平均成绩和它属于谁。这里有几个主题是关于如何查找值是否出现在数组中的。我正在努力解决的问题是,如果平均成绩最高的学生超过 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]);
}
}
另一种方法是创建一个包含两个属性(name
和 average grade
)的 class,然后生成一个 List
并将其填入 for
循环。下一步是 order by descending
列表通过 average grade
和 select 前 N 个元素相等。之后,您可以使用 ForEach