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

时间:2019-07-07 20:57:07

标签: c# for-loop arraylist

给我们一个硬件,以更改使用2d数组的C#中的先前硬件,而不是使用2d数组,我们使用一个数组列表,该列表具有在称为“学生”的对象中声明的变量。

我想使用一种方法来计算学生的最佳成绩;但是,该方法给我以下错误和警告:

错误:

  

CS0161'Form1.Calc_HighestMarkOutput(int)':并非所有代码路径都返回一个值。

警告:

  

CS0162检测不到代码。

在用户输入的数组列表中(通过使用重载构造函数):

学生姓名,数学标记,英语标记,马耳他标记,电子邮件地址。

由于在该方法中我要归还所有学生获得的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;
        }

1 个答案:

答案 0 :(得分:1)

您遇到错误,因为返回语句在循环内部。如果列表为空,则return语句将永远不会执行。此外,您仅在循环完成后才知道结果。因此,请将返回语句放置在循环之后。

由于此方法的目的是查找最高分数,因此将这样的索引作为参数传递给例程毫无意义。

使用foreachfor更容易,因为您不必处理索引。

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

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行。