Если предполагается, что универсальный класс или метод будут использовать любые другие операции с универсальными элементами, кроме обычного присвоения или вызывать методы, которые не поддерживает System.Object
, то нам необходимо применить ограничения к параметру типа. Что из себя представляют ограничения типа и как используются в C# мы и рассмотрим сегодня.
Глава 7. Универсальные шаблоны (generics)
Класс ObservableCollection в C#
Ещё один интересный и полезный в работе класс коллекций, предоставляемый платформой .NET — класс ObservableCollection
располагается в пространстве имен System.Collections.ObjectModel
. В целом, этот класс по своим свойствам и методам соответствует обычному списку List
за тем лишь исключением, что ObservableCollection
позволяет отслеживать изменения, происходящие со списком объектов и информировать другие объекты об этих изменениях.
Словарь Dictionary в C#
Коллекция Dictionary<K,V>
представляет собой так называемый словарь. В такой коллекции каждый элемент представляет собой пару «ключ — значение». Соответственно, основное назначение Dictionary<K,V>
— это получение значения по его ключу. По сути, словарь — это хэш-таблица и получение значения с помощью ключа выполняется очень быстро, близко к O (1). Скорость извлечения значения (V
) зависит от качества алгоритма хэширования для типа, указанного для ключа(K)
.
Стек Stack в C#
Стек — это структура данных (коллекция, последовательность), содержащая один или несколько элементов одного типа и работающая по принципу LIFO («last in — first out», «последний вошел — первый вышел»).
В C# стек представляет класс обобщенный класс Stack<T>
. Вывод элементов стека происходит в обратном порядке (принцип LIFO), в то время, как используя очередь (Queue
) вывод элементов происходит в прямом порядке (первый вошел — первый вышел), а, используя список List
, мы можем организовать вывод в любом удобном для нас порядке.
Очередь Queue в C#
Очередь — это структура данных, содержащая один или несколько элементов одного типа и работающая по принципу FIFO («first in — first out», «первый вошел — первый вышел»). В отличие от списка или массива, очередь не допускает произвольный доступ к своим элементам — чтение происходит только с первого элемента по порядку до конца. Так же, мы не можем поместить новый элемент в произвольную позицию очереди — только в конец очереди.
Класс Queue<T>
представляет собой очередь в C#. Рассмотрим основные моменты работы с очередью в C#.
Двунаправленный (двусвязный) список в C# (класс LinkedList)
Двунаправленный (или двусвязный) список – это список, который состоит из последовательности элементов, каждый из которых содержит информационную часть (данные) и два указателя на соседние элементы (на следующий и предыдущий элементы). В пространстве имен .NET C# System.Collections.Generic
содержится класс LinkedList<T>
, реализующий двунаправленный (двусвязный список).
Сортировка элементов списка List
В предыдущей части мы познакомились с тем, что из себя представляет универсальный список List<T>
, научились создавать такие списки и выводить значения различных элементов списка в консоль. Сегодня разберемся с тем, как сортировать списки List<T>
, содержащие различные типы элементов.
Универсальный список List
В C# для хранения набора однотипных элементов можно использовать массивы. Однако, что мы будем делать, если заранее не известно какое количество элементов нам необходимо хранить? Или же, количество элементов может постоянно меняться? Каждый раз создавать новый массив и копировать данные из одного массива в другой — не совсем правильный вариант. В таких случаях, наиболее удобно и правильно использовать универсальный список List<T>
.
Универсальные шаблоны (generics) в C#
Для начала, определимся с некоторыми терминами. В Сети можно встретить самые различные названия того, что Microsoft называет «универсальными шаблонами»: обобщения, просто «шаблоны» и, даже, дженерики (не путать с лекарственными средствами). Вне зависимости того, как будет называться универсальный шаблон или как вы привыкли его называть, под этим термином я буду подразумевать ровно тоже самое, что и разработчики C# — классы и методы с типами, спецификация которых отложена до момента объявления и создания экземпляров в клиентском коде. Теперь попробуем разобраться с универсальными шаблонами C# более подробно.