C# 如何在c中使用for循环的方法中,在对象中应用带有变量的arraylist#

C# 如何在c中使用for循环的方法中,在对象中应用带有变量的arraylist#,c#,for-loop,arraylist,C#,For Loop,Arraylist,我们得到了一个hw来改变C#中以前的hw,它使用2d数组,而不是使用2d数组,我们使用一个数组列表,在名为Students的对象中声明变量 我想用一种方法来计算学生的最佳分数;但是,该方法会给我一个错误和警告,如下所示: 错误: CS0161“Form1.Calc_HighestMarkOutput(int)”:并非所有代码路径都返回值 警告: 检测到CS0162无法访问的代码 在arraylist中,用户输入(通过使用重载构造函数): 学生姓名、数学成绩、英语成绩、马耳他成绩、电子邮件地址 由

我们得到了一个hw来改变C#中以前的hw,它使用2d数组,而不是使用2d数组,我们使用一个数组列表,在名为Students的对象中声明变量

我想用一种方法来计算学生的最佳分数;但是,该方法会给我一个错误和警告,如下所示:

错误:

CS0161“Form1.Calc_HighestMarkOutput(int)”:并非所有代码路径都返回值

警告:

检测到CS0162无法访问的代码

在arraylist中,用户输入(通过使用重载构造函数):

学生姓名、数学成绩、英语成绩、马耳他成绩、电子邮件地址

由于在这个方法中,我返回了所有学生在3门学科中获得的3个最高分,所以我决定返回一个数组。它将由主程序中的临时数组通过selectedindex访问

请帮我找到问题

先谢谢你

    public int[] Calc_HighestMarkOutput(int HighestMarkIndex)
    {
        int[] HighestMarkOutput = new int[3];

        int HighestMarkMaths = 0;
        int HighestMarkEnglish = 0;
        int HighestMarkMaltese = 0;
        int TMPHighestMarkMaths = 0;
        int TMPHighestMarkEnglish = 0;
        int TMPHighestMarkMaltese = 0;

        for (int i = 0; i < myStudents.Count; i++) //a loop through an array list.
        {
            if (myStudents[HighestMarkIndex].Maths_Result > HighestMarkMaths)
            {
                TMPHighestMarkMaths = myStudents[HighestMarkIndex].Maths_Result;

                HighestMarkMaths = TMPHighestMarkMaths;
            }
            if (myStudents[HighestMarkIndex].English_Result > HighestMarkEnglish)
            {
                TMPHighestMarkEnglish = myStudents[HighestMarkIndex].English_Result;

                HighestMarkEnglish = TMPHighestMarkEnglish;
            }
            if (myStudents[HighestMarkIndex].Maltese_Result > HighestMarkMaltese)
            {
                TMPHighestMarkMaltese = myStudents[HighestMarkIndex].Maltese_Result;

                HighestMarkMaltese = TMPHighestMarkMaltese;
            }

            HighestMarkOutput[0] = HighestMarkMaths;
            HighestMarkOutput[1] = HighestMarkEnglish;
            HighestMarkOutput[2] = HighestMarkMaltese;

            return HighestMarkOutput;
        }
public int[]Calc_HighestMarkOutput(int HighestMarkIndex)
{
int[]HighestMarkOutput=新int[3];
int highestmarkmath=0;
int HighestMarkEnglish=0;
int HighestMarkMaltese=0;
int tmphighestmarkmath=0;
int-TMPHighestMarkEnglish=0;
int TMPHighestMarkMaltese=0;
for(int i=0;iHighestMarkMaths)
{
tmphighestmarkmath=myStudents[HighestMarkIndex]。数学成绩;
最高市场数学=最高市场数学;
}
如果(我的学生[HighestMarkIndex].English\u结果>HighestMarkEnglish)
{
TMPHighestMarkEnglish=myStudents[HighestMarkIndex]。英语成绩;
HighestMarkEnglish=TMPHighestMarkEnglish;
}
如果(我的学生[HighestMarkIndex].Maltese_结果>HighestMarkMaltese)
{
TMPHighestMarkMaltese=myStudents[HighestMarkIndex]。马耳他语结果;
最高马尔萨斯语=最高马尔萨斯语;
}
HighestMarkOutput[0]=HighestMarkMath;
HighestMarkOutput[1]=HighestMarkEnglish;
HighestMarkOutput[2]=HighestMarkMaltese;
返回最高标记输出;
}

您收到一个错误,因为返回语句位于循环内。如果列表为空,则返回语句将永远不会执行。此外,您只有在循环完成后才能知道结果。因此,请将返回语句放在循环后

由于此方法的目的是查找最高分数,因此将此类索引作为参数传递到例程中是没有意义的

使用
foreach
for
更容易,因为您不必处理索引

返回包含结果的未命名学生,而不是返回数组。您可以删除无用的临时变量

public Student Calc_HighestMarkOutput()
{
    var result = new Student(); // You also might have to add a default constructor.

    foreach (Student student in myStudents) {
        if (student.Maths_Result > result.Maths_Result) {
            result.Maths_Result = student.Maths_Result;
        }
        if (student.English_Result > result.English_Result) {
            result.English_Result = student.English_Result;
        }
        if (student.Maltese_Result > result.Maltese_Result) {
            result.Maltese_Result = student.Maltese_Result;
        }
    }
    return result;
}
您还可以使用
Math.Max
简化最大值的查找

foreach (Student student in myStudents) {
    result.Maths_Result = Math.Max(result.Maths_Result, student.Maths_Result);
    result.English_Result = Math.Max(result.English_Result, student.English_Result);
    result.Maltese_Result = Math.Max(result.Maltese_Result, student.Maltese_Result);
}

通过这些重构,该方法将从22行(不包括空行和只包含大括号的行)缩减到7行。