Как применить arraylist с переменными в Object внутри метода, использующего цикл for в c # - PullRequest
0 голосов
/ 07 июля 2019

Нам было дано hw для изменения предыдущего hw в C #, в котором использовались 2d-массивы, и вместо использования 2d-массивов мы используем список Array с переменными, объявленными в объекте с именем Students.

Я бы хотелиспользовать метод для вычисления наилучшей оценки студента;однако метод выдает ошибку и предупреждение:

Ошибка:

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 Ответ

1 голос
/ 08 июля 2019

Вы получаете ошибку, потому что оператор возврата находится внутри цикла.Если список пуст, инструкция return никогда не будет выполнена.Кроме того, вы знаете результат только после завершения цикла.Поэтому поместите оператор return после цикла.

Поскольку целью этого метода является поиск самых высоких оценок, нет смысла передавать такой индекс в подпрограмму в качестве параметра.

Использовать 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 строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...