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;