Индекс за пределами диапазона

using System;
using System.Collections;
using System.Collections.Generic;

namespace дневник
{
    public class Static
    {
        Menu menu = new Menu();

        private List<int> _score;
        public string Name;
        public List<int> Math;
        public List<int> Read;
        public List<int> Envir;
        public List<int> Physic;
        public List<int> Letter;

        public Static()
        {
            Math = new List<int>();
            Read = new List<int>();
            Envir = new List<int>();
            Physic = new List<int>();
            Letter = new List<int>();
        }

        public void MathStatic(int math)
        {
            Math.Add(math);
        }

        public void ReadStatic(int read)
        {
            Read.Add(read);
        }

        public void EnvirStatic(int envir)
        {
            Envir.Add(envir);
        }

        public void PhysicStatic(int physic)
        {
            Physic.Add(physic);
        }

        public void LetterStatic(int letter)
        {
            Letter.Add(letter);
        }

        public void ChooseLesson()
        {
            int lesson = menu.Lesson();
            if (lesson == 1)
            {
                MathStatic(menu.ReadScore());
            }

            else if (lesson == 2)
            {
                ReadStatic(menu.ReadScore());
            }

            else if (lesson == 3)
            {
                EnvirStatic(menu.ReadScore());
            }

            else if (lesson == 4)
            {
                PhysicStatic(menu.ReadScore());
            }

            else if (lesson == 5)
            {
                LetterStatic(menu.ReadScore());
            }

            else if (lesson == 6)
            {
                return;
            }

            else
            {
                menu.ShowInvalidMenuPointText();
            }
        }

        public void ShowMath()
        {
            double sumTmp = 0.0;

            foreach (var mathElement in Math)
            {
                sumTmp += mathElement;
            }

            Math.Sort();
            Console.WriteLine($"По мамематике минимальной оценкой является {Math[0]}, максимальной оценкой является {Math[Math.Count - 1]}, средней оценкой является {sumTmp / Math.Count}");
        }

        public void ShowRead()
        {
            double sumTmp = 0.0;

            foreach (var readElement in Read)
            {
                sumTmp += readElement;
            }

            Read.Sort();
            Console.WriteLine($"По чтению минимальной оценкой является {Read[0]}, максимальной оценкой является {Read[Read.Count - 1]}, средней оценкой является {sumTmp / Read.Count}");
        }

        public void ShowEnvir()
        {
            double sumTmp = 0.0;

            foreach (var envirElement in Envir)
            {
                sumTmp += envirElement;
            }

            Envir.Sort();
            Console.WriteLine($"По природоведению минимальной оценкой является {Envir[0]}, максимальной оценкой является {Envir[Envir.Count - 1]}, средней оценкой является {sumTmp / Envir.Count}");
        }

        public void ShowPhysic()
        {
            double sumTmp = 0.0;

            foreach (var physicElement in Physic)
            {
                sumTmp += physicElement;
            }

            Physic.Sort();
            Console.WriteLine($"По физической культуре минимальной оценкой является {Physic[0]}, максимальной оценкой является {Physic[Physic.Count - 1]}, средней оценкой является {sumTmp / Physic.Count}");
        }

        public void ShowLetter()
        {
            double sumTmp = 0.0;

            foreach (var letterElement in Letter)
            {
                sumTmp += letterElement;
            }

            Letter.Sort();
            Console.WriteLine($"По письму минимальной оценкой является {Letter[0]}, максимальной оценкой является {Letter[Letter.Count - 1]}, средней оценкой является {sumTmp / Letter.Count}");
        }

        public void ShowStatic()
        {
            double sumTmp = 0.0;

            foreach (var scoreElement in _score)
            {
                sumTmp += scoreElement;
            }

            _score.Sort();
            Console.WriteLine($"Минимальной оценкой является {_score[0]}, максимальной оценкой является {_score[_score.Count - 1]}, средней оценкой является {sumTmp / _score.Count}");
        }
    }
}

Программа для дневника при выводе статистики выдает ошибку в чем проблема?

System.ArgumentOutOfRangeException: "Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции. введите сюда описание изображения


Ответы (1 шт):

Автор решения: motpfofs

Ваша ошибка связана с тем, что вы обращаетесь к минус первому элементу списка. В момент создания списка в нём 0 элементов, а при попытке вывести статистику вы обращаетесь к элементу -1: Math[Math.Count - 1].

Проще всего обойти эту проблему проверить наличие элементов в списке:

if (Math.Count > 0)
{
    mathMaxValue = Math[Math.Count - 1];
}

Но это не самое оптимальное решение. Сортировка достаточно трудозатратная операция и использовать её для того, чтобы получить минимальное и максимальное значение не самая лучшая практика. Тем более, вы уже проходите по списку один раз, когда вычисляется среднее значение. Вы можете добавить две переменные, которые отражают максимальное и минимальное значение и проверять при переборе не является ли текущий элемент максимальным или минимальным:

int mathMinValue = 0;
int mathMaxValue = 0;

foreach (var mathElement in Math)
{
    sumTmp += mathElement;

    if (mathElement < mathMinValue)
    {
        mathMinValue = mathElement;
    }

    if (mathElement > mathMaxValue)
    {
        mathMaxValue = mathElement;
    }
}

P.S.: Так же я советую воспользоваться оператором switch вместо разветвлённой логики if() else if():

switch (lesson)
{
    case 1:
        MathStatic(menu.ReadScore());
        break;
    case 2:
        ReadStatic(menu.ReadScore());
        break;
    case 3:
        EnvirStatic(menu.ReadScore());
        break;
    case 4:
        PhysicStatic(menu.ReadScore());
        break;
    case 5:
        LetterStatic(menu.ReadScore());
        break;
    case 6:
        return;
    default:
        menu.ShowInvalidMenuPointText();
        break;
}
→ Ссылка