Лабораторная работа 3. Варианты второго уровня Универсальные типы. Классы-коллекции. Методы расширения класса System.Linq.Enumerable Информация для всех вариантов Во всех вариантах второго уровня требуется определить универсальный делегат delegate System.Collections.Generic.KeyValuePair<TKey,TValue> GenerateElement<TKey, TValue>(int j); и универсальный класс TestCollections<TKey,TValue>, который содержит закрытые поля следующих типов System.Collections.Generic.List; System.Collections.Generic.List ; System.Collections.Generic.Dictionary<TKey, TValue> ; System.Collections.Generic.Dictionary<string, TValue>; GenerateElement<TKey, TValue>. Конкретные значения типовых параметров TKey и TValue зависят от варианта. В конструкторе класса TestCollections<TKey,TValue> создаются коллекции с заданным числом элементов. Надо сравнить время поиска элемента в коллекциях-списках List и время поиска элемента по ключу и элемента по значению в коллекциях-словарях Dictionary<TKey,TValue>. Для автоматической генерации элементов коллекций надо определить метод, который принимает один целочисленный параметр типа int и возвращает ссылку на объект типа KeyValuePair<TKey,TValue>. Метод должен инициализировать объекты KeyValuePair<TKey,TValue> так, чтобы соответствие между номером элемента и объектом TKey в паре ключ-значение было взаимно-однозначным. Метод для автоматической генерации элементов коллекций передается в класс TestCollections<TKey,TValue> через параметр конструктора класса. Для этого в классе TestCollections<TKey,TValue> надо определить конструктор c двумя параметрами, имеющими тип int и GenerateElement. Через целочисленный параметр объектам класса передается число элементов в коллекциях, через экземпляр делегата GenerateElement – метод, который используется для автоматической генерации пары ключ-значение в виде объекта KeyValuePair<TKey,TValue>.
Число элементов в коллекциях пользователь вводит в процессе работы приложения. Если при вводе была допущена ошибка, приложение должно обработать исключение, сообщить об ошибке ввода и повторить прием ввода до тех пор, пока не будет правильно введено целочисленное значение. Для четырех разных элементов – первого, центрального, последнего и элемента, не входящего в коллекцию, – надо измерить время поиска элемента в коллекциях List и List с помощью метода Contains; элемента по ключу в коллекциях Dictionary< TKey, TValue> и Dictionary <string, TValue > с помощью метода ContainsKey; значения элемента в коллекции Dictionary< TKey, TValue > с помощью метода ContainsValue. Так как статический метод для автоматической генерации элементов должен обеспечивать взаимно-однозначное соответствие между значением целочисленного параметра метода и объектами TKey, его можно использовать как при создании коллекций, так и для генерации элемента для поиска.
Вариант 2. Требования к программе Определить новые версии классов Article, Edition и Magazine из лабораторной работы 2. В класс Article добавить реализации интерфейсов System.IComparable для сравнения объектов типа Article по названию статьи; System.Collections.Generic.IComparer
для сравнения объектов типа Article по фамилии автора. Определить вспомогательный класс, реализующий интерфейс System.Collections.Generic.IComparer, который можно использовать для сравнения объектов типа Article по рейтингу статьи. В новой версии класса Magazine использовать типы System.Collections.Generic.List для списка редакторов журнала; System.Collections.Generic.List для списка статей в журнале. В новых версиях Edition и Magazine сохранить все остальные поля, свойства и методы из предыдущей версии класса, внести необходимые исправления в код свойств и методов из-за изменения типов полей для списка редакторов журнала и списка статей. В классе Magazine определить методы для сортировки списка статей по названию статьи; по фамилии автора; по рейтингу статьи. Определить универсальный делегат delegate TKey KeySelector(Magazine mg); Определить универсальный класс MagazineCollection, содержащий коллекцию объектов типа Magazine, в котором для хранения коллекции используется тип System.Collections.Generic.Dictionary<TKey, Magazine>. Типовой параметр TKey универсального класса MagazineCollection определяет тип ключа в коллекции Dictionary<TKey, Magazine>. Метод, который используется для вычисления ключа при добавлении элемента Magazine в коллекцию класса MagazineCollection, отвечает делегату KeySelector и передается MagazineCollection через параметр единственного конструктора класса. Класс MagazineCollection содержит закрытое поле типа System.Collections.Generic.Dictionary<TKey, Magazine>; закрытое поле типа KeySelector для хранения экземпляра делегата с методом, вычисляющим ключ для объекта Magazine; конструктор c одним параметром типа KeySelector ; метод void AddDefaults(), c помощью которого можно добавить некоторое число элементов типа Magazine для инициализации коллекции по умолчанию; метод void AddMagazines ( params Magazine[] ) для добавления элементов в коллекцию Dictionary<TKey, Magazine>; перегруженную версию виртуального метода string ToString() для формирования строки, содержащей информацию обо всех элементах коллекции Dictionary<TKey, Magazine>, в том числе значения всех полей, включая список редакторов издания и список статей в журнале для каждого элемента Magazine; метод string ToShortString(), который формирует строку с информацией обо всех элементах коллекции Dictionary<TKey, Magazine>, содержащую значения всех полей, значение среднего рейтинга статей, число редакторов издания и число статей в журнале для каждого элемента Magazine, но без списков редакторов и статей. В классе MagazineCollection определить свойства и методы, выполняющие операции со словарем Dictionary<TKey, Magazine> с использованием методов расширения класса System.Linq.Enumerable и статические методы-селекторы, которые необходимы для выполнения соответствующих операций с коллекцией: свойство типа double (только с методом get), возвращающее максимальное значение среднего рейтинга статей для элементов коллекции; если в коллекции нет элементов, свойство возвращает некоторое значение по умолчанию; для поиска максимального значения среднего рейтинга статей надо использовать метод Max класса System.Linq.Enumerable; метод IEnumerable<KeyValuePair<TKey,Magazine>>FrequencyGroup(Frequency value), возвращающий подмножество элементов коллекции Dictionary<TKey,Magazine> с заданной периодичностью выхода журнала; для формирования подмножества использовать метод Where класса System.Linq.Enumerable; свойство типа IEnumerable<IGrouping<Frequency,KeyValuePair<TKey,Magazine >>> (только с методом get), выполняющее группировку элементов коллекции
Dictionary<TKey, Magazine> в зависимости от периодичности выхода журнала с помощью метода Group класса System.Linq.Enumerable. В методе Main()
- Создать объект Magazine и вызвать методы, выполняющие сортировку списка List статей в журнале по разным критериям, после каждой сортировки вывести данные объекта. Выполнить сортировку по названию статьи; по фамилии автора; по рейтингу статьи.
- Создать объект MagazineCollection. Добавить в коллекцию несколько разных элементов типа Magazine и вывести объект MagazineCollection.
- Вызвать методы класса MagazineCollection, выполняющие операции с коллекцией-словарем Dictionary<TKey, Magazine>, и после каждой операции вывести результат операции. Выполнить вычисление максимального значения среднего рейтинга статей для элементов коллекции; вызвать метод FrequencyGroup для выбора журналов с заданной периодичностью выхода; вызвать свойство класса, выполняющее группировку элементов коллекции по периодичности выхода; вывести все группы элементов.
- Создать объект типа TestCollection<Edition, Magazine>. Ввести число элементов в коллекциях и вызвать метод для поиска первого, центрального, последнего и элемента, не входящего в коллекции. Вывести значения времени поиска для всех четырех случаев.