Bool IsProperSupersetOf(lEnumera
возвращает логическое значение true, если вы
ble<T> other)
зывающее множество является правильным надмножеством другого множества other, а иначе — логическое значение false
bool IsSubsetOf(IEnumerable<T>
Возвращает логическое значение true, если вы
other)
зывающее множество является подмножеством другого множества other, а иначе — логическое значение false
Bool
Возвращает логическое значение true, если вы
IsSupersetOf(IEnumerable<T>
зывающее множество является надмножеством
other)
другого множества other, а иначе — логическое значение false
bool Overlaps(IEnumerable<T>
Возвращает логическое значение true, если вы
other)
зывающее множество и другое множество otherсодержат хотя бы один общий элемент, а иначе — логическое значение false
bool SetEquals(IEnumerable<T>
Возвращает логическое значение true, если все
other)
элементы вызывающего множества и другого множества otherоказываются общими, а иначе —логическое значение false. Порядок расположения элементов не имеет значения, а дублирующиеся элементы во другом множестве otherигнорируются
Void SymmetricExceptWith
После вызова этого метода вызывающее множе
(IEnumerable<T> other)
ство будет содержать симметрическую разность своих элементов и элементов другого множества
other
void UnionWith(IEnumerable<T>
После вызова этого метода вызывающее множе
other)
ство будет содержать объединение своих элементов и элементов другого множества other
Структура KeyValuePair<TKey, TValue>
В пространстве имен System.Collections. Generic определена структура KeyValuePair<TKey, TValue>. Она служит для хранения ключа и его значения и применяется в классах обобщенных коллекций, в которых хранятся пары "ключ-значение", как, например, в классе Dictionary<TKey, TValueX В этой структуре определяются два следующих свойства.
public TKey Key { get; }; public TValue Value { get; };
В этих свойствах хранятся ключ и значение соответствующего элемента коллекции. Для построения объекта типа KeyValuePair<TKey, TValue> служит конструктор:
public KeyValuePair(TKey key, TValue value) где key обозначает ключ, a value — значение.
Классы обобщенных коллекций
Как упоминалось ранее, классы обобщенных коллекций по большей части соответствуют своим необобщенным аналогам, хотя в некоторых случаях они носят другие имена. Отличаются они также своей организацией и функциональными возможностями. Классы обобщенных коллекций определяются в пространстве имен System. Collections . Generic. В табл. 25.14 приведены классы, рассматриваемые в этой главе. Эти классы составляют основу обобщенных коллекций.
Таблица 25.14. Основные классы обобщенных коллекций
Класс
Описание
Dictionary<Tkey,
TValue>
Сохраняет пары “ключ-значение". Обеспечивает такие же функциональные возможности, как и необобщенный класс Hashtable
HashSet<T>
Сохраняет ряд уникальных значений, используя хеш-таблицу
LinkedList<T>
Сохраняет элементы в двунаправленном списке
List<T>
Создает динамический массив. Обеспечивает такие же функциональные возможности, как и необобщенный класс ArrayList
Queue<T>
Создает очередь. Обеспечивает такие же функциональные возможности, как и необобщенный класс Queue
SortedDictionary<TKey,
Создает отсортированный список из пар “ключ-
TValue>
значение"
SortedList<TKey,
TValue>
Создает отсортированный список из пар “ключ-значение”. Обеспечивает такие же функциональные возможности, как и необобщенный класс SortedList
SortedSet<T>
Создает отсортированное множество
Stack<T>
Создает стек. Обеспечивает такие же функциональные возможности, как и необобщенный класс Stack
ПРИМЕЧАНИЕ
В пространстве имен System. Collections. Generic находятся также следующие классы: класс SynchronizedCollection<T> синхронизированной коллекции на основе класса IList<T>; класс SynchronizedReadOnlyCollection<T>, доступной только для чтения синхронизированной коллекции на основе класса lList<T>; абстрактный класс SynchronizedKeyCollectioncK, т>, служащий в качестве базового для класса коллекции System. ServiceModel. UriSchemeKeyedCollection; а также класс KeyedByTypeCollection<T> коллекции, в которой в качестве ключей используются отдельные типы данных.
Класс List<T>
В классе List<T> реализуется обобщенный динамический массив. Он ничем принципиально не отличается от класса необобщенной коллекции ArrayList. В этом классе реализуются интерфейсы ICollection, ICollection<T>, IList, IList<T>, IEnumerable и IEnumerable<T>. У класса List<T> имеются следующие конструкторы.
Public List()
public List(IEnumerable<T> collection) public List(int capacity)
Первый конструктор создает пустую коллекцию класса List с выбираемой по умолчанию первоначальной емкостью. Второй конструктор создает коллекцию типа List с количеством инициализируемых элементов, которое определяется параметром collection и равно первоначальной емкости массива. Третий конструктор создает коллекцию типа List, имеющую первоначальную емкость, задаваемую параметром capacity . В данном случае емкость обозначает размер базового массива, используемого для хранения элементов коллекции. Емкость коллекции, создаваемой в виде динамического массива, может увеличиваться автоматически по мере добавления в нее элементов.
В классе List<T> определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Некоторые из наиболее часто используемых методов этого класса перечислены в табл. 25.15.
Таблица 25.15. Наиболее часто используемые методы, определенные в классе List<T>
Метод
Описание
public virtual void AddRange(Icollection - collection) public virtual int BinarySearch(T item)
Добавляет элементы из коллекции collection в конец вызывающей коллекции типа ArrayList
Выполняет поиск в вызывающей коллекции значения, задаваемого параметром item. Возвращает индекс совпавшего элемента. Если искомое значение не найдено, возвращается отрицательное значение. Вызывающий список должен быть отсортирован
Метод
Описание
Public
Int BinarySearch(T
Выполняет поиск в вызывающей коллекции значе
item,
IComparer<T> comparer)
ния, задаваемого параметром item , используя для сравнения указанный способ, определяемый параметром comparer. Возвращает индекс совпавшего элемента. Если искомое значение не найдено, возвращается отрицательное значение. Вызывающий список должен быть отсортирован
Public
Int BinarySearch(int
Выполняет поиск в вызывающей коллекции значе
index,
int count, T item,
ния, задаваемого параметром item , используя для
IComparer<T> comparer)
сравнения указанный способ, определяемый параметром comparer. Поиск начинается с элемента, указываемого по индексу index, и включает количество элементов, определяемых параметром count. Метод возвращает индекс совпавшего элемента. Если искомое значение не найдено, возвращается отрицательное значение. Вызывающий список должен быть отсортирован
Public
List<T> GetRange(int
Возвращает часть вызывающей коллекции. Часть
index,
int count)
возвращаемой коллекции начинается с элемента, указываемого по индексу index , и включает количество элементов, задаваемое параметром count. Возвращаемый объект ссылается на те же элементы, что и вызывающий объект
Public
int IndexOf(T item)
Возвращает индекс первого вхождения элемента item в вызывающей коллекции. Если искомый элемент не обнаружен, возвращается значение -1
Public
Void InsertRange(int
Вставляет элементы коллекции collection в вы
index,
IEnumerable<T>
зывающую коллекцию, начиная с элемента, указы
collection)
ваемого по индексу index
public i tern)
Int LastlndexOf(T
Возвращает индекс последнего вхождения элемента item в вызывающей коллекции. Если искомый элемент не обнаружен, возвращается значение -1
Public
Void RemoveRange(int
Удаляет часть вызывающей коллекции, начиная с
index,
int count)
элемента, указываемого по индексу index , и включая количество элементов, определяемое параметром count
Public
Void Reverse()
Располагает элементы вызывающей коллекции в обратном порядке
Public
Void Reverse(int
Располагает в обратном порядке часть вызываю
index,
int count)
щей коллекции, начиная с элемента, указываемого по индексу index , и включая количество элементов, определяемое параметром count
Public
Void Sort()
Сортирует вызывающую коллекцию по нарастающей
Окончание табл. 25.15
Метод
Описание
Public void
Сортирует вызывающую коллекцию, используя
Sort(IComparer<T> comparer)
для сравнения способ, задаваемый параметром comparer. Если параметр comparer имеет пустое значение, то для сравнения используется способ, выбираемый по умолчанию
Public void
Сортирует вызывающую коллекцию, используя для
Sort(Comparison<T> comparison)
сравнения указанный делегат
public void Sort(int index,
Сортирует вызывающую коллекцию, используя
int count , IComparer<T>
для сравнения способ, задаваемый параметром
comparer)
comparer. Сортировка начинается с элемента, указываемого по индексу index , и включает количество элементов, определяемых параметром count. Если параметр comparer имеет пустое значение, то для сравнения используется способ, выбираемый по умолчанию
public T [ ] ToArrayO
Возвращает массив, содержащий копии элементов вызывающего объекта
Public void TrimExcess()
Сокращает емкость вызывающей коллекции таким образом, чтобы она не превышала 10% от количества элементов, хранящихся в ней на данный момент
В классе List<T> определяется также собственное свойство Capacity, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Это свойство объявляется следующим образом.
public int Capacity { get; set; }
Свойство Capacity позволяет установить и получить емкость вызывающей коллекции в качестве динамического массива. Эта емкость равна количеству элементов, которые может содержать коллекция до ее вынужденного расширения. Такая коллекция расширяется автоматически, и поэтому задавать ее емкость вручную необязательно. Но из соображений эффективности это иногда можно сделать, если заранее известно количество элементов коллекции. Благодаря этому исключаются издержки на выделение дополнительной памяти.
В классе List<T> реализуется также приведенный ниже индексатор, определенный в интерфейсе IList<T>.
public Т this[int index] { get; set; }
С помощью этого индексатора устанавливается и получается значение элемента коллекции, указываемое по индексу index.
В приведенном ниже примере программы демонстрируется применение класса List<T>. Это измененный вариант примера, демонстрировавшего ранее класс ArrayList. Единственное изменение, которое потребовалось для этого, заключалось в замене класса ArrayList классом List, а также в использовании параметров обобщенного типа.
// Продемонстрировать применение класса List<T>. using System;