Example #1
0
        // Сравнение времени поиска элемента в коллекциях-списках List<TKey>
        // и времени поиска элемента по ключу и элемента по значению в коллекциях-словарях Dictionary<TKey,TValue>.
        // Метод, который вычисляет время поиска элемента в списках List<Person> и List<string>,
        // время поиска элемента по ключу и время поиска элемента по значению в коллекциях-словарях Dictionary<Person, Student> и Dictionary<string, Student>:
        public void calcSearchTime()
        {
            Debug.Assert((this._personList.Count == this._stringList.Count) &&
                         (this._personList.Count == this._personStudentDict.Count) &&
                         (this._personList.Count == this._stringStudentDict.Count), "Коллекции не содержат одинаковое число элементов!");

            int       numberOfElementsInCollections = this._personList.Count;
            const int elCount = 4;

            // Для четырех разных элементов -
            Student studentFirst        = TestCollections.GenerateStudent(1); // первого,
            Person  personFirst         = studentFirst.StudentInfo;
            string  personFirstAsString = personFirst.ToString();

            int centralIdx = (int)Math.Ceiling(numberOfElementsInCollections / 2.0);

            Console.WriteLine("Индекс центрального элемента = {0}", centralIdx);
            Student studentCentral        = TestCollections.GenerateStudent(centralIdx); // центрального,
            Person  personCentral         = studentCentral.StudentInfo;
            string  personCentralAsString = personCentral.ToString();

            Student studentLast        = TestCollections.GenerateStudent(numberOfElementsInCollections); // последнего
            Person  personLast         = studentLast.StudentInfo;
            string  personLastAsString = personLast.ToString();

            Student studentNotIncluded        = TestCollections.GenerateStudent(numberOfElementsInCollections + 1); // и элемента, не входящего в коллекцию
            Person  personNotIncluded         = studentNotIncluded.StudentInfo;
            string  personNotIncludedAsString = personNotIncluded.ToString();

            // - измерение времени поиска:

            object[][] el = new object[3][];
            for (int i = 0; i < el.Length; i++)
            {
                el[i] = new object[elCount];
            }

            el[0][0] = studentFirst;        el[0][1] = studentCentral;        el[0][2] = studentLast;        el[0][3] = studentNotIncluded;
            el[1][0] = personFirst;         el[1][1] = personCentral;         el[1][2] = personLast;         el[1][3] = personNotIncluded;
            el[2][0] = personFirstAsString; el[2][1] = personCentralAsString; el[2][2] = personLastAsString; el[2][3] = personNotIncludedAsString;

            Stopwatch watch;

            long[][] elapsedMs = new long[5][];
            for (int i = 0; i < elapsedMs.Length; i++)
            {
                elapsedMs[i] = new long[elCount];
            }

            bool result;

            // элемента в коллекциях List<TKey> и List<string> с помощью метода Contains:
            for (int i = 0; i < elCount; i++)
            {
                watch  = System.Diagnostics.Stopwatch.StartNew();
                result = this._personList.Contains(el[0][i]);
                watch.Stop();
                Debug.Assert(i < elCount - 1 ? result : !result);
                elapsedMs[0][i] = watch.ElapsedMilliseconds;
            }

            for (int i = 0; i < elCount; i++)
            {
                watch  = System.Diagnostics.Stopwatch.StartNew();
                result = this._stringList.Contains(el[2][i]);
                watch.Stop();
                Debug.Assert(i < elCount - 1 ? result : !result);
                elapsedMs[1][i] = watch.ElapsedMilliseconds;
            }

            // элемента по ключу в коллекциях Dictionary< TKey, TValue> и Dictionary<string, TValue > с помощью метода ContainsKey:
            for (int i = 0; i < elCount; i++)
            {
                Person key = (Person)el[1][i];
                watch  = System.Diagnostics.Stopwatch.StartNew();
                result = this._personStudentDict.ContainsKey(key);
                watch.Stop();
                Debug.Assert(i < elCount - 1 ? result : !result);
                elapsedMs[2][i] = watch.ElapsedMilliseconds;
            }

            for (int i = 0; i < elCount; i++)
            {
                String key = (String)el[2][i];
                watch  = System.Diagnostics.Stopwatch.StartNew();
                result = this._stringStudentDict.ContainsKey(key);
                watch.Stop();
                Debug.Assert(i < elCount - 1 ? result : !result);
                elapsedMs[3][i] = watch.ElapsedMilliseconds;
            }

            // значения элемента в коллекции Dictionary< TKey, TValue > с помощью метода ContainsValue:
            for (int i = 0; i < elCount; i++)
            {
                Student value = (Student)el[0][i];
                watch  = System.Diagnostics.Stopwatch.StartNew();
                result = this._personStudentDict.ContainsValue(value);
                watch.Stop();
                Debug.Assert(i < elCount - 1 ? result : !result);
                elapsedMs[4][i] = watch.ElapsedMilliseconds;
            }

            Console.WriteLine("{0, -22}{1, -14}{2, -10}{3, -10}{4, -10}{5, -10}",
                              "Структура данных", "Метод", "Первый", "Централ.", "Последний", "Не вход.");
            for (int i = 0; i < elapsedMs.Length; i++)
            {
                switch (i)
                {
                case 0:
                    Console.Write("{0, -22}{1, -14}", "List<Person>", "Contains");
                    break;

                case 1:
                    Console.Write("{0, -22}{1, -14}", "List<string>", "Contains");
                    break;

                case 2:
                    Console.Write("{0, -22}{1, -14}", "Dict.<Person,Student>", "ContainsKey");
                    break;

                case 3:
                    Console.Write("{0, -22}{1, -14}", "Dict.<string,Student>", "ContainsKey");
                    break;

                case 4:
                    Console.Write("{0, -22}{1, -14}", "Dict.<Person,Student>", "ContainsValue");
                    break;

                default:
                    break;
                }
                for (int j = 0; j < elCount; j++)
                {
                    Console.Write("{0, -10}", elapsedMs[i][j]);
                }
                Console.WriteLine();
            }
        }
        // № 1
        // Метод Main():
        static void Main(string[] args)
        {
            Console.WriteLine("Лабораторная работа № 5");
            Console.WriteLine("Название: Универсальные типы. Классы-коллекции.\n"
                              + "\tМетоды расширения класса System.Linq.Enumerable.");
            Console.WriteLine("ФИО студента: ");
            Console.WriteLine("Группа студента: ");
            Console.WriteLine("Дата выполнения: 19 апреля 2018 года");
            Console.WriteLine();

            Console.WriteLine("\n\n//---------------------------------------------------------------------");

            Console.Out.WriteLine("№ 2");
            // Создание объекта типа StudentCollection:
            StudentCollection students = new StudentCollection();

            // Добавление в коллекцию несколько различных элементов типа Student:
            students.AddDefaults();

            Console.Out.WriteLine("Вывод объекта StudentCollection:");
            Console.Out.WriteLine(students);

            Console.WriteLine("\n\n//---------------------------------------------------------------------");

            Console.Out.WriteLine("№ 3");
            // Для созданного объекта StudentCollection вызов методов,
            // выполняющих сортировку списка List<Student> по разным критериям,
            // и после каждой сортировки вывод данных объекта:

            Console.Out.WriteLine("\n\n\tСортировка по фамилии студента:");
            students.SortByLastName();
            Console.Out.WriteLine(students.ToShortString());

            Console.Out.WriteLine("\n\n\tСортировка по дате рождения:");
            students.SortByDateOfBirth();
            Console.Out.WriteLine(students.ToShortString());

            Console.Out.WriteLine("\n\n\tСортировка по среднему баллу:");
            students.SortByAvgScore();
            Console.Out.WriteLine(students.ToShortString());

            Console.WriteLine("\n\n//---------------------------------------------------------------------");

            Console.Out.WriteLine("№ 4");
            // Вызов методов класса StudentCollection, выполняющих операции со списком List<Student>,
            // и после каждой операции вывод результата операции:

            // Вычисление максимального значения среднего балла для элементов списка:
            Console.Out.WriteLine("\n\nМакс. значения ср. балла для элементов списка = {0}", students.MaxAvgScore);

            // Фильтрация списка для отбора студентов с формой обучения Education.Specialist:
            Console.Out.WriteLine("\n\nСтуденты с формой обучения Education.Specialist:");
            foreach (Student specialist in students.Specialists)
            {
                Console.Out.WriteLine(specialist.ToShortString());
            }

            // Группировка элементов списка по значению среднего балла:

            double queryAvgScore = 4.33;

            Console.WriteLine("\n\n\tГруппа студентов со ср. баллом {0}:", queryAvgScore);
            foreach (Student student in students.AverageMarkGroup(queryAvgScore))
            {
                Console.WriteLine(student.ToShortString());
            }

            Console.WriteLine("\n\nВывод всех групп элементов:");
            foreach (IGrouping <double, Student> studentGroup in students.AllAvgScoreGroups())
            {
                Console.WriteLine("\tГруппа студентов со ср. баллом {0}:", studentGroup.Key);
                foreach (Student student in studentGroup)
                {
                    Console.WriteLine(student.ToShortString());
                }
            }

            Console.WriteLine("\n\n//---------------------------------------------------------------------");

            Console.Out.WriteLine("№ 5");

            // Число элементов в коллекциях вводится пользователем в процессе работы приложения.
            // Если при вводе была допущена ошибка, приложение обрабатывает исключение, сообщает об ошибке ввода
            // и повторяет прием ввода до тех пор, пока не будет правильно введено целочисленное значение.

            int numberOfElementsInCollections;

            do
            {
                Console.Out.Write("Введите число элементов в коллекциях -> ");
                string inputLine = Console.ReadLine();  // ввод строки.
                try
                {
                    if (!int.TryParse(inputLine, NumberStyles.Integer, CultureInfo.InvariantCulture, out numberOfElementsInCollections))
                    {
                        throw new ArgumentException("При вводе была допущена ошибка!");
                    }
                    else
                    {
                        break;
                    }
                }
                catch (ArgumentException e)
                {
                    Console.Out.WriteLine(e.Message);
                    continue;
                }
            } while (true);

            // Создание объекта типа TestCollections:
            TestCollections tests = new TestCollections(numberOfElementsInCollections);

            // Вызов метода для поиска в коллекциях первого, центрального, последнего и элемента, не входящего в коллекции.
            // Вывод значений времени поиска для всех четырех случаев.
            // Вывод содержит информацию о том, к какой коллекции и к какому элементу относится данное значение:
            tests.calcSearchTime();

            Console.ReadKey();
        }