// Конструктор c параметром типа int (число элементов в коллекциях) для автоматического создания коллекций с заданным числом элементов: public TestCollections(int numberOfElementsInCollections) { // В конструкторе класса TestCollections создаются коллекции с заданным числом элементов. // Все четыре коллекции содержат одинаковое число элементов: this._personList = new List <Person>(numberOfElementsInCollections); this._stringList = new System.Collections.Generic.List <string>(numberOfElementsInCollections); this._personStudentDict = new System.Collections.Generic.Dictionary <Person, Student>(numberOfElementsInCollections); this._stringStudentDict = new System.Collections.Generic.Dictionary <string, Student>(numberOfElementsInCollections); for (int id = 1; id <= numberOfElementsInCollections; id++) { Student student = TestCollections.GenerateStudent(id); Person person = student.StudentInfo; // Каждому элементу из коллекции List<TKey> должен отвечать элемент в коллекции Dictionary<TKey, TValue> с равным значением ключа: this._personList.Add(person); this._personStudentDict.Add(person, student); // Список List<string> состоит из строк, которые получены в результате вызова метода ToString() для объектов TKey из списка List<TKey>: string personAsString = person.ToString(); this._stringList.Add(personAsString); // Каждому элементу списка List<string> отвечает элемент в коллекции-словаре Dictionary<string, TValue> с равным значением ключа типа string: this._stringStudentDict.Add(personAsString, student); } }
// Сравнение времени поиска элемента в коллекциях-списках 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(); } }