Индекс за пределами диапазона
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 шт):
Ваша ошибка связана с тем, что вы обращаетесь к минус первому элементу списка.
В момент создания списка в нём 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;
}