public static List <string> getLastResults(int student_ID, string themeName, string blockName, string loadName)
        // Возвращает последний результат пользователя
        {
            List <string> lastResults = new List <string>();
            results       data        = createEntery();

            for (int row = 0; row < data.ID.Count() - 1; row++)
            {
                if (System.Convert.ToInt32(data.ID[row]) == student_ID)
                {
                    if (data.theme[row].ToString() == themeName)
                    {
                        if (data.block[row].ToString() == blockName)
                        {
                            if (data.load[row].ToString() == loadName)
                            {
                                lastResults = new List <string>
                                {
                                    data.timeSpent[row].ToString(),
                                    data.scoreResult[row].ToString(),
                                    data.correctAnswers[row].ToString(),
                                    data.testDate[row].ToString()
                                };
                            }
                        }
                    }
                }
            }
            return(lastResults);
        }
        // "Генерация" ID
        public static int idGeneration(results r, int id = -1)
        {
            Random rnd = new Random();

            // Провреятся если такой пользователь
            for (int i = 0; i < r.ID.Count(); i++)
            {
                if (r.lastName[i].ToString() == r.lastName[r.lastName.Count() - 1].ToString() &&
                    r.firstName[i].ToString() == r.firstName[r.firstName.Count() - 1].ToString() &&
                    r.secondName[i].ToString() == r.secondName[r.secondName.Count() - 1].ToString() &&
                    r.group[i].ToString() == r.group[r.group.Count() - 1].ToString())
                {
                    id = System.Convert.ToInt32(r.ID[i]);
                }
            }
            // Если нет, то генерируется случайное ID
            if (id == -1)
            {
restart:
                id = rnd.Next(100000, 999999);
                foreach (int item in r.ID)  // Проверка на наличие такого же ID
                {
                    if (id == item)
                    {
                        goto restart;  // Если ID слуйчано уже получилось такое, какое есть генерируется новое и проврка начинается заного
                    }
                }
            }
            return(id);
        }
 public static void saveData(results r)
 // Загрузка в Results.json
 {
     using (StreamWriter file = File.CreateText("Database/Results_Test.json"))
     {
         JsonSerializer serializer = new JsonSerializer();
         serializer.Serialize(file, r);
     }
 }
        public static results createEntery()
        {
            using (StreamReader file = new StreamReader("Database/Results_Test.json", System.Text.Encoding.UTF8))
            {
                JsonTextReader reader             = new JsonTextReader(file);
                JObject        obj_students       = (JObject)JToken.ReadFrom(reader);
                JArray         arr_ID             = obj_students.GetValue("ID") as JArray;
                JArray         arr_lastName       = obj_students.GetValue("lastName") as JArray;
                JArray         arr_firstName      = obj_students.GetValue("firstName") as JArray;
                JArray         arr_secondName     = obj_students.GetValue("secondName") as JArray;
                JArray         arr_group          = obj_students.GetValue("group") as JArray;
                JArray         arr_theme          = obj_students.GetValue("theme") as JArray;
                JArray         arr_block          = obj_students.GetValue("block") as JArray;
                JArray         arr_load           = obj_students.GetValue("load") as JArray;
                JArray         arr_variant        = obj_students.GetValue("variant") as JArray;
                JArray         arr_timeSpent      = obj_students.GetValue("timeSpent") as JArray;
                JArray         arr_tips           = obj_students.GetValue("tips") as JArray;
                JArray         arr_scoreResult    = obj_students.GetValue("scoreResult") as JArray;
                JArray         arr_correctAnswers = obj_students.GetValue("correctAnswers") as JArray;
                JArray         arr_testDate       = obj_students.GetValue("testDate") as JArray;

                results r = new results
                {
                    ID             = arr_ID,
                    lastName       = arr_lastName,
                    firstName      = arr_firstName,
                    secondName     = arr_secondName,
                    group          = arr_group,
                    theme          = arr_theme,
                    block          = arr_block,
                    load           = arr_load,
                    variant        = arr_variant,
                    timeSpent      = arr_timeSpent,
                    tips           = arr_tips,
                    scoreResult    = arr_scoreResult,
                    correctAnswers = arr_correctAnswers,
                    testDate       = arr_testDate
                };
                return(r);
            }
        }
        public static Dictionary <Tuple <string, string, string, string>, List <List <string> > > getAllResults()
        // Возвращает полный список результатов вида

        /*
         * {
         *  ["Фамилия", "Имя", "Отчество", "Группа"]: [
         *          ["Тема", "Блок", "Нагрузка", "Вариант", "Потраченное время", "Кол-во подсказок", "Баллы/Оценка", "Правильные ответы", "Дата"],
         *          ["Тема", "Блок", "Нагрузка", "Вариант", "Потраченное время", "Кол-во подсказок", "Баллы/Оценка", "Правильные ответы", "Дата"],
         *          ...
         *        ],
         *  ["Фамилия", "Имя", "Отчество", "Группа"]: [
         *          ["Тема", "Блок", "Нагрузка", "Вариант", "Потраченное время", "Кол-во подсказок", "Баллы/Оценка", "Правильные ответы", "Дата"],
         *          ["Тема", "Блок", "Нагрузка", "Вариант", "Потраченное время", "Кол-во подсказок", "Баллы/Оценка", "Правильные ответы", "Дата"],
         *          ...
         *        ],
         *  ...
         * } */
        {
            results r = createEntery();
            Dictionary <Tuple <string, string, string, string>, List <List <string> > > allResults = new Dictionary <Tuple <string, string, string, string>, List <List <string> > >();
            List <string> explored = new List <string>();

            for (int i = 0; i < r.theme.Count; i++)
            {
                if (!explored.Contains(r.ID[i].ToString()))               // Если ID еще не обрабатывалось, то начинаем работу с ним
                {
                    var FIOG = new Tuple <string, string, string, string> // Записываем в отдельный список ФИО и группу
                               (
                        r.lastName[i].ToString(),
                        r.firstName[i].ToString(),
                        r.secondName[i].ToString(),
                        r.group[i].ToString()
                               );

                    var testData = new List <List <string> >(); // Инициализация списка, с данными о всех прохождениях студента
                    testData.Add
                        (new List <string>
                    {
                        r.theme[i].ToString(),
                        r.block[i].ToString(),
                        r.load[i].ToString(),
                        r.variant[i].ToString(),
                        r.timeSpent[i].ToString(),
                        r.tips[i].ToString(),
                        r.scoreResult[i].ToString(),
                        r.correctAnswers[i].ToString(),
                        r.testDate[i].ToString()
                    }
                        );
                    allResults.Add(FIOG, testData); // Добавление данных в общий словарь
                    explored.Add(r.ID[i].ToString());
                }
                else // Если ID уже был обработан хотя бы раз, то мы записываем данные о тестах в значения, используя как ключ пользовательские данные
                {
                    var FIOG = new Tuple <string, string, string, string> // Записываем в отдельный список ФИО и группу
                               (
                        r.lastName[i].ToString(),
                        r.firstName[i].ToString(),
                        r.secondName[i].ToString(),
                        r.group[i].ToString()
                               );
                    var testData = new List <List <string> >(); // Инициализация списка, с данными о всех прохождениях студента
                    testData.Add
                        (new List <string>
                    {
                        r.theme[i].ToString(),
                        r.block[i].ToString(),
                        r.load[i].ToString(),
                        r.variant[i].ToString(),
                        r.timeSpent[i].ToString(),
                        r.tips[i].ToString(),
                        r.scoreResult[i].ToString(),
                        r.correctAnswers[i].ToString(),
                        r.testDate[i].ToString()
                    }
                        );
                    foreach (List <string> row in allResults[FIOG])
                    {
                        testData.Add(row);
                    }
                    allResults[FIOG] = testData;
                }
            }
            return(allResults);
        }