// Сравнение времени поиска элемента в коллекциях-списках 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(); }