Получение верхних значений из списка до-диез - PullRequest
0 голосов
/ 07 мая 2018

Так что у меня возникли проблемы с программой на C #, которая предназначена для суммирования значения 8-го значения из списка.

Программа работает путем объявления переменной currenthigh, в которой хранится значение из gradelist. Затем он сравнивает себя со значением abshigh, чтобы увидеть, превышает ли оно установленное максимальное значение. Если это так, он устанавливает currenthigh в качестве нового наибольшего значения.

Как только цикл прошел по списку и подтвердил самое высокое значение, он добавляет его в переменную uppertotal и использует переменную ejector, чтобы удалить его из списка. Затем программа выполняет итерации, на этот раз без предыдущего наибольшего значения. Он повторяется 8 раз, так что в итоге 8 верхних значений добавляются к uppertotal.

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

int currenthigh = 0;
int abshigh = 0;
int ejector = 0;
int uppertotal = 0;

for (int g = 0; g < 8; g++)
{
    for (int z = 0; z < gradelist.Count; z++)
    {
        Console.WriteLine("PASS STARTED");
        currenthigh = Convert.ToInt32((gradelist[z]));
        Console.WriteLine("currenthigh" + currenthigh);

        if (currenthigh > abshigh)
        {
            abshigh = currenthigh;
            ejector = z;
        }

    }
    Console.WriteLine("ejector" + ejector);
    uppertotal = uppertotal + currenthigh;

    gradelist.RemoveAt(ejector);
    Console.WriteLine("PASS COMPLETE");
    Console.WriteLine("RESETING");      
}

Примечание - gradelist - это список целых чисел, содержащий не менее 12 элементов за все время.

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Это происходит потому, что вы не удаляете самое высокое значение из списка оценок. Обратите внимание, вы поставили Z в эжектор, но Z - это индекс в списке оценок, и когда вы пытаетесь удалить его, вы ничего не удаляете, потому что в списке оценок нет участника Z! Вместо

gradelist.RemoveAt(ejector);

Вы должны сделать это:

gradelist.RemoveAt(gradelist[ejector]);

Но я бы порекомендовал вам совершенно другой подход. Если вы просто хотите получить свой верхний итог, который является суммой лучших 8 членов в градлисте, используйте этот простой трюк:

uppertotal += gradelist.OrderByDescending(p => p).Take(8).Sum();
0 голосов
/ 07 мая 2018

Ваш код чрезвычайно велик для относительно простой задачи.
Вы можете выбрать верхнюю часть списка X следующим образом:

top_list = gradelist.OrderByDescending(i => i).Take(X)

При работе со списками / коллекциями System.Linq ваш друг

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