/// <summary>
        /// Расчет среднего  балла и сортировка по критериям
        /// </summary>
        /// <param name="sort">Критерии сортировки</param>
        /// <param name="numBalls">Последовательность из кол-ва генерируемых оценок каждого типа</param>
        /// <param name="marksWeights">Последовательность оценок, которая была внесена в таблицу</param>
        /// <returns></returns>
        internal override List <float> SortMarks(SortMarkStructAverage sort, int numBalls, List <int> marksWeights)
        {
            List <float> averBall = new List <float>();

            int preBall = 0, preWeight = 0;

            if (marksWeights != null)
            {
                for (int i = 0; i < marksWeights.Count; i++)
                {
                    preBall   += marksWeights[i];
                    preWeight += 1;
                }
            }

            for (int i = 0; i < sort.marks.Count; i++)
            {
                int resultBall = 0, resultWeight = 0;

                foreach (int oneMark in sort.marks[i])
                {
                    resultBall += oneMark;

                    resultWeight += 1;
                }

                averBall.Add((float)Math.Round((Convert.ToSingle(resultBall + preBall) / Convert.ToSingle(resultWeight + preWeight)), 2));
            }

            SortCriteriaRecurse(sort, averBall);

            return(averBall);
        }
 /// <summary>
 /// Сортировка списка сгенерированных оценок
 /// </summary>
 /// <param name="sort">Структура в который находятся критерии для сортировки</param>
 /// <param name="averBall">Список со средними баллами</param>
 internal override void SortCriteriaRecurse(SortMarkStructAverage sort, List <float> averBall)
 {
     for (int i = 0; i < sort.marks.Count; i++)
     {
         for (int j = 0; j < sort.marks[i].Length; j++)
         {
             if (!(sort.criteria[0] <= sort.marks[i][j] && sort.criteria[1] >= sort.marks[i][j]) || !(sort.averBall[0] <= averBall[i] && sort.averBall[1] >= averBall[i]))
             {
                 sort.marks.RemoveAt(i);
                 averBall.RemoveAt(i);
                 SortCriteriaRecurse(sort, averBall);
                 return;
             }
         }
     }
 }
        /// <summary>
        /// Генерирует последовательность оценок
        /// </summary>
        /// <param name="numBalls">Последовательность из кол-ва генерируемых оценок каждого типа</param>
        /// <param name="criteria">Последовательность с параметрами индивидуальной сложности оценок</param>
        /// <param name="_averBall">Последовательность с параметрами сортировки по среднему баллу</param>
        /// <param name="marksWeights">Последовательность оценок, которая была внесена в таблицу</param>
        /// <returns></returns>
        public override MarksDataAverage GenMarks(int numBalls, int[] criteria, float[] _averBall, List <int> marksWeights)
        {
            List <int[]> itogMarks = new List <int[]>();

            GenMarksRecurse(numBalls, itogMarks);

            SortMarkStructAverage sort = new SortMarkStructAverage
            {
                criteria = criteria,
                marks    = itogMarks,
                averBall = _averBall
            };

            List <float> averBall = SortMarks(sort, numBalls, marksWeights);

            MarksDataAverage data = new MarksDataAverage
            {
                averBall   = averBall,
                countBalls = numBalls,
                marks      = itogMarks
            };

            return(data);
        }
 /// <summary>
 /// Расчет среднего балла и сортировка по критериям
 /// </summary>
 /// <param name="sort">Критерии сортировки</param>
 /// <param name="numBalls">Последовательность из кол-ва генерируемых оценок каждого типа</param>
 /// <param name="marksWeights">Последовательность оценок, которая была внесена в таблицу</param>
 /// <returns></returns>
 internal virtual List <float> SortMarks(
     SortMarkStructAverage sort,
     int numBalls,
     List <int> marksWeights) => null;
 /// <summary>
 /// Сортировка списка сгенерированных оценок
 /// </summary>
 /// <param name="sort">Структура в который находятся критерии для сортировки</param>
 /// <param name="averBall">Список со средними баллами</param>
 internal virtual void SortCriteriaRecurse(
     SortMarkStructAverage sort,
     List <float> averBall)
 {
 }