Текст книги "C# 4.0: полное руководство"
Автор книги: Герберт Шилдт
Жанр:
Программирование
сообщить о нарушении
Текущая страница: 78 (всего у книги 83 страниц)
foreach(char ch in ll)
Console.Write(ch + " ");
Console.WriteLine(«n»);
// Отобразить связный список, обойдя его
// вручную в обратном направлении.
Console.Write("Следовать по ссылкам в обратном направлении: ");
for(node = ll.Last; node != null; node = node.Previous)
Console.Write(node.Value + " ");
Console.WriteLine («n»);
// Удалить из списка два элемента.
Console.WriteLine(«Удалить 2 элемента из списка»);
// Удалить элементы из связного списка.
ll.Remove('С');
ll.Remove('А');
Console.WriteLine("Количество элементов в списке: " + ll.Count);
// Отобразить содержимое видоизмененного списка в цикле foreach.
Console.Write("Содержимое списка после удаления элементов: ");
foreach(char ch in ll)
Console.Write(ch + " ");
Console.WriteLine («n»);
// Добавить три элемента в конец списка.
ll.AddLast('X');
ll.AddLast('Y');
ll.AddLast('Z');
Console.Write("Содержимое списка после ввода элементов: ");
foreach(char ch in ll)
Console.Write(ch + " ");
Console.WriteLine(«n»);
}
}
Ниже приведен результат выполнения этой программы.
Исходное количество элементов в списке: 0
Добавить в список 5 элементов
Количество элементов в списке: 5
Отобразить содержимое списка по ссылкам: Е D С В А
Отобразить содержимое списка в цикле foreach: Е D С В А
Следовать по ссылкам в обратном направлении: А В С D Е
Удалить 2 элемента из списка
Количество элементов в списке: 3
Содержимое списка после удаления элементов: Е D В
Содержимое списка после ввода элементов: Е D В X Y Z
Самое примечательное в этой программе – это обход списка в прямом и обратном направлении, следуя по ссылкам, предоставляемым свойствами Next
и Previous
. Двунаправленный характер подобных связных списков имеет особое значение для приложений, управляющих базами данных, где нередко требуется перемещаться по списку в обоих направлениях.
Класс DictionaryCTKey, TValue>
Класс Dictionary
позволяет хранить пары «ключ-значение» в коллекции как в словаре. Значения доступны в словаре по соответствующим ключам. В этом отношении данный класс аналогичен необобщенному классу Hashtable
. В классе Dictionary
реализуются интерфейсы IDictionary, IDictionary
и IDeserializationCallback
. В двух последних интерфейсах поддерживается сериализация списка. Словари имеют динамический характер, расширяясь по мере необходимости.
В классе Dictionary
предоставляется немало конструкторов. Ниже перечислены наиболее часто используемые из них.
public Dictionary()
public Dictionary(IDictionaryCTKey, TValue> dictionary)
public Dictionary(int capacity)
В первом конструкторе создается пустой словарь с выбираемой по умолчанию первоначальной емкостью. Во втором конструкторе создается словарь с указанным количеством элементов dictionary. А в третьем конструкторе с помощью параметра capaci ty указывается емкость коллекции, создаваемой в виде словаря. Если размер словаря заранее известен, то, указав емкость создаваемой коллекции, можно исключить изменение размера словаря во время выполнения, что, как правило, требует дополнительных затрат вычислительных ресурсов.
В классе Dictionary
Таблица 25.17. Наиболее часто используемые методы, определенные в классе Die tionaryCTKey, TValue>
Метод – Описание
public void Add(TKeykey, TValue value) – Добавляет в словарь пару “ключ-значение", определяемую параметрами key и value. Если ключ key уже находится в словаре, то его значение не изменяется, и генерируется исключение ArgumentException
public bool ContainsKey(TKey key) – Возвращает логическое значение true, если вызывающий словарь содержит объект key в качестве ключа; а иначе – логическое значение false
public bool ContainsValue(TValue value) – Возвращает логическое значение true, если вызывающий словарь содержит значение value; в противном случае – логическое значение false
public bool Remove(TKeykey) – Удаляет ключ key из словаря. При удачном исходе операции возвращается логическое значение true, а если ключ key отсутствует в словаре – логическое значение false
Кроме того, в классе Dictionary
определяются собственные свойства, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Эти свойства приведены ниже.
Свойство – Описание
public IEqualityComparer
public Dictionary
public Dictionary
Следует иметь в виду, что ключи и значения, содержащиеся в коллекции, доступны отдельными списками с помощью свойств Keys
и Values
. В коллекциях типа DictionaryCTKey, TValue>.KeyCollection
и Dictionary
реализуются как обобщенные, так и необобщенные формы интерфейсов ICollection
и IEnumerable
.
И наконец, в классе DictionaryCTKey, TValue>
реализуется приведенный ниже индексатор, определенный в интерфейсе IDictionary
public TValue this[TKey key] { get; set; }
Этот индексатор служит для получения и установки значения элемента коллекции, а также для добавления в коллекцию нового элемента. Но в качестве индекса в данном случае служит ключ элемента, а не сам индекс.
При перечислении коллекции типа DictionaryCTKey, TValue> из нее возвращаются пары "ключ-значение" в форме структуры KeyValuePairCTKey, TValue>
Напомним, что в этой структуре определяются два поля.
public TKey Key;
public TValue Value;
В этих полях содержится ключ или значение соответствующего элемента коллекции. Как правило, структура KeyValuePairCTKey, TValue>
не используется непосредственно, поскольку средства класса DictionaryCTKey, TValue>
позволяют работать с ключами и значениями по отдельности. Но при перечислении коллекции типа Dictionary
, например, в цикле foreach
перечисляемыми объектами являются пары типа KeyValuePair
.
Все ключи в коллекции типа DictionaryCTKey, TValue>
должны быть уникальными, причем ключ не должен изменяться до тех пор, пока он служит в качестве ключа. В то же время значения не обязательно должны быть уникальными. К тому же объекты не хранятся в коллекции типа DictionaryCTKey, TValue>
в отсортированном порядке.
В приведенном ниже примере демонстрируется применение класса DictionaryCTKey, TValue>
// Продемонстрировать применение класса обобщенной
// коллекции DictionaryCTKey, TValueX
using System;
using System.Collections.Generic;
class GenDictionaryDemo {
static void Main() {
// Создать словарь для хранения имен и фамилий
// работников и их зарплаты.
Dictionary
new Dictionary
// Добавить элементы в коллекцию,
diet.Add(«Батлер, Джон», 73000);
diet.Add(«Шварц, Capa», 59000);
diet.Add(«Пайк, Томас», 45000);
diet.Add(«Фрэнк, Эд», 99000);
// Получить коллекцию ключей, т.е. фамилий и имен.
ICollection
// Использовать ключи для получения значений, т.е. зарплаты,
foreach(string str in с)
Console.WriteLine («{0}, зарплата: {1:C}», str, diet[str]);
}
}
Ниже приведен результат выполнения этой программы.
Батлер, Джон, зарплата: $73 000,00
Шварц, Capa, зарплата: $59 000,00
Пайк, Томас, зарплата: $45 000,00
Фрэнк, Эд, зарплата: $99 000,00
Класс SortedDictionary
В коллекции класса SortedDictionary
пары «ключ-значение» хранятся таким же образом, как и в коллекции класса Dictionary
, за исключением того, что они отсортированы по соответствующему ключу. В классе SortedDictionary
реализуются интерфейсы IDictionary, IDictionary
и IEnumerable
. В классе SortedDictionary
предоставляются также следующие конструкторы.
public SortedDictionary()
public SortedDictionary(IDictionary
public SortedDictionary(IComparer
public SortedDictionary(IDictionaryCTKey, TValue> dictionary,
IComparer
В первом конструкторе создается пустой словарь, во втором конструкторе – словарь с указанным количеством элементов dictionary. В третьем конструкторе допускается указывать с помощью параметра comparer типа IComparer
способ сравнения, используемый для сортировки, а в четвертом конструкторе – инициализировать словарь, помимо указания способа сравнения.
В классе SortedDictionary
определен ряд методов. Некоторые наиболее часто используемые методы этого класса сведены в табл. 25.18.
Таблица 25.18. Наиболее часто используемые методы, определенные в классе SortedDictionaryCTKey, TValue>
Метод – Описание
public void Add (TKey key, TValue value) –
Добавляет в словарь пару “ключ-значение", определяемую параметрами key и value. Если ключ key уже находится в словаре, то его значение не изменяется, и генерируется исключение ArgumentException
public bool ContainsKey (TKeyкеу) – Возвращает логическое значение true, если вызывающий словарь содержит объект key в качестве ключа; в противном случае – логическое значение false
public bool ContainsValue(TValuevalue)public bool Remove(TKeykey) – Возвращает логическое значение true, если вызывающий словарь содержит значение value; в противном случае – логическое значение false Удаляет ключ key из словаря. При удачном исходе операции возвращается логическое значение true, а если ключ key отсутствует в словаре – логическое значение false
Кроме того, в классе SortedDictionary
Свойство – Описание
public Icomparer
public SortedDictionary
public SortedDictionary
Следует иметь в виду, что ключи и значения, содержащиеся в коллекции, доступны отдельными списками с помощью свойств Keys
и Values
. В коллекциях типа SortedDictionary
и SortedDictionary
реализуются как обобщенные, так и необобщенные формы интерфейсов ICollection
и IEnumerable
.
И наконец, в классе SortedDictionary
реализуется приведенный ниже индексатор, определенный в интерфейсе IDictionary
public TValue this[TKey key] { get; set; }
Этот индексатор служит для получения и установки значения элемента коллекции, а также для добавления в коллекцию нового элемента. Но в данном случае в качестве индекса служит ключ элемента, а не сам индекс.
При перечислении коллекции типа SortedDictionary
из нее возвращаются пары «ключ-значение» в форме структуры KeyValuePair
Напомним, что в этой структуре определяются два следующих поля.
public TKey Key; public TValue Value;
В этих полях содержится ключ или значение соответствующего элемента коллекции. Как правило, структура KeyValuePair
не используется непосредственно, поскольку средства класса SortedDictionary
позволяют работать с ключами и значениями по отдельности. Но при перечислении коллекции типа SortedDictionary
, например в цикле foreach
, перечисляемыми объектами являются пары типа KeyValuePair
.
Все ключи в коллекции типа SortedDictionary
должны быть уникальными, причем ключ не должен изменяться до тех пор, пока он служит в качестве ключа. В то же время значения не обязательно должны быть уникальными.
В приведенном ниже примере демонстрируется применение класса SortedDictionary
Это измененный вариант предыдущего примера, демонстрировавшего применение класса Dictionary
В данном варианте база данных работников отсортирована по фамилии и имени работника, которые служат в качестве ключа.
// Продемонстрировать применение класса обобщенной
// коллекции SortedDictionary
using System;
using System.Collections.Generic;
class GenSortedDictionaryDemo {
static void Main() {
// Создать словарь для хранения имен и фамилий
// работников и их зарплаты.
SortedDictionary
new SortedDictionary
// Добавить элементы в коллекцию,
diet.Add(«Батлер, Джон», 73000);
diet.Add(«Шварц, Capa», 59000);
diet.Add(«Пайк, Томас», 45000);
diet.Add(«Фрэнк, Эд», 99000);
// Получить коллекцию ключей, т.е. фамилий и имен.
ICollection
// Использовать ключи для получения значений, т.е. зарплаты,
foreach(string str in с)
Console.WriteLine(«{0}, зарплата: {1:C}», str, diet[str]);
}
}
Эта программа дает следующий результат.
Батлер, Джон, зарплата: $73,000.00
Пайк, Томас, зарплата: $45,000.00
Фрэнк, Эд, зарплата: $99,000.00
Шварц, Сара, зарплата: $59,000.00
Как видите, список работников и их зарплаты отсортированы по ключу, в качестве которого в данном случае служит фамилия и имя работника.
Класс SortedList
В коллекции класса SortedList
хранится отсортированный список пар «ключ-значение». Это обобщенный эквивалент класса необобщенной коллекции SortedList
. В классе SortedList
реализуются интерфейсы IDictionary, IDictionary
и IEnumerable
. Размер коллекции типа SortedList
изменяется динамически, автоматически увеличиваясь по мере необходимости. Класс SortedList
подобен классу SortedDictionary
, но у него другие рабочие характеристики. В частности, класс SortedList
использует меньше памяти, тогда как класс SortedDictionary
позволяет быстрее вставлять неупорядоченные элементы в коллекцию.
В классе SortedListcTKey, TValue>
предоставляется немало конструкторов. Ниже перечислены наиболее часто используемые конструкторы этого класса.
public SortedList()
public SortedList(IDictionaryCTKey, TValue> dictionary)
public SortedList(int capacity)
public SortedList(IComparer
В первой форме конструктора создается пустой список с выбираемой по умолчанию первоначальной емкостью. Во второй форме конструктора создается отсортированный список с указанным количеством элементов dictionary. В третьей форме конструктора с помощью параметра capacity задается емкость коллекции, создаваемой в виде отсортированного списка. Если размер списка заранее известен, то, указав емкость создаваемой коллекции, можно исключить изменение размера списка во время выполнения, что, как правило, требует дополнительных затрат вычислительных ресурсов. И в четвертой форме конструктора допускается указывать с помощью параметра comparer способ сравнения объектов, содержащихся в списке.
Емкость коллекции типа SortedList
увеличивается автоматически по мере необходимости, когда в список добавляются новые элементы. Если текущая емкость коллекции превышается, то она увеличивается. Преимущество указания емкости коллекции типа SortedList
при ее создании заключается в снижении или полном исключении издержек на изменение размера коллекции. Разумеется, указывать емкость коллекции целесообразно лишь в том случае, если заранее известно, сколько элементов требуется хранить в ней.
В классе SortedList
определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Некоторые из наиболее часто используемых методов этого класса перечислены в табл. 25.19. Следует иметь в виду, что перечислитель, возвращаемый методом GetEnumerator()
, служит для перечисления пар «ключ-значение», хранящихся в отсортированном списке в виде объектов типа KeyValuePair
.
Таблица 25.19. Наиболее часто используемые методы, определенные в классе SortedListCTKey, TValue>
Метод – Описание
public void Add (TKey key,TValuevalue) – Добавляет в список пару “ключ-значение", определяемую параметрами key и value. Если ключ key уже находится в списке, то его значение не изменяется, и генерируется исключение ArgumentException
public bool ContainsKey (ТКkey) Возвращает логическое значение true, если вызывающий список содержит объект key в каче-_стве ключа; а иначе —логическое значение false
public bool ContainsValue(TValuevalue) – Возвращает логическое значение true, если вызывающий список содержит значение value; в противном случае – логическое значение false
public IEnumerator
public int IndexOfKey(TKeykey) – Возвращает индекс ключа key. Если искомый ключ не обнаружен в списке, возвращается значение -1
public int IndexOfValue(TValuevalue) – Возвращает индекс первого вхождения значения value в вызывающем списке. Если искомое значение не обнаружено в списке, возвращается значение -1
public bool Remove(TKeykey) – Удаляет из списка пару “ключ-значение” по указанному ключу key. При удачном исходе операции возвращается логическое значение true, а если ключ key отсутствует в списке – логическое значение false
public void RemoveAt(intindex) - Удаляет из списка пару “ключ-значение” по указанному индексу index
public void TrimExcess() – Сокращает избыточную емкость вызывающей коллекции в виде отсортированного списка
Кроме того, в классе SortedList
определяются собственные свойства, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Эти свойства приведены ниже.
Свойство – Описание
public int Capacity { get; set; } – Получает или устанавливает емкость вызывающей коллекции в виде отсортированного списка
public IComparer
public IList
public IList
И наконец, в классе SortedList
реализуется приведенный ниже индексатор, определенный в интерфейсе IDictionaryCTKey, TValue>
public TValue this[TKey key] { get; set; }
Этот индексатор служит для получения и установки значения элемента коллекции, а также для добавления в коллекцию нового элемента. Но в данном случае в качестве индекса служит ключ элемента, а не сам индекс.
В приведенном ниже примере демонстрируется применение класса SortedList
Это еще один измененный вариант представленного ранее примера базы данных работников. В данном варианте база данных хранится в коллекции типа SortedList
.
// Продемонстрировать применение класса обобщенной
// коллекции SortedList
using System;
using System.Collections.Generic;
class GenSLDemo {
static void Main() {
// Создать коллекцию в виде отсортированного списка
// для хранения имен и фамилий работников и их зарплаты.
SortedList
new SortedList
// Добавить элементы в коллекцию,
sl.Add(«Батлер, Джон», 73000);
sl.Add(«Шварц, Capa», 59000);
sl.Add(«Пайк, Томас», 45000);
sl.Add(«Фрэнк, Эд», 99000);
// Получить коллекцию ключей, т.е. фамилий и имен.
ICollection
// Использовать ключи для получения значений, т.е. зарплаты,
foreach(string str in с)
Console.WriteLine(«{0}, зарплата: {1:C}», str, sl[str]);
Console.WriteLine();
}
}
Ниже приведен результат выполнения этой программы.
Батлер, Джон, зарплата: $73,000.00
Пайк, Томас, зарплата: $45,000.00
Фрэнк, Эд, зарплата: $99,000.00
Шварц, Сара, зарплата: $59,000.00
Как видите, список работников и их зарплаты отсортированы по ключу, в качестве которого в данном случае служит фамилия и имя работника.
Класс Stack
Класс Stack
является обобщенным эквивалентом класса необобщенной коллекции Stack
. В нем поддерживается стек в виде списка, действующего по принципу «первым пришел – последним обслужен». В этом классе реализуются интерфейсы Collection, IEnumerable
и IEnumerable
. Кроме того, в классе Stack
непосредственно реализуются методы Clear(),Contains()
и СоруТо()
, определенные в интерфейсе ICollection
. А методы Add()
и Remove()
в этом классе не поддерживаются, как, впрочем, и свойство IsReadOnly
. Коллекция класса Stack
имеет динамический характер, расширяясь по мере необходимости, чтобы вместить все элементы, которые должны в ней храниться. В классе Stack
определяются следующие конструкторы.
public Stack()
public Stack(int capacity)
public Stack(IEnumerable
В первой форме конструктора создается пустой стек с выбираемой по умолчанию первоначальной емкостью, а во второй форме – пустой стек, первоначальный размер которого определяет параметр capacity. И в третьей форме создается стек, содержащий элементы коллекции, определяемой параметром collection. Его первоначальная емкость равна количеству указанных элементов.
В классе Stack
определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются, а также в интерфейсе ICollection
. Некоторые из наиболее часто используемых методов этого класса перечислены в табл.25.20. Как и в классе Stack
, эти методы обычно применяются следующим образом. Для того чтобы поместить объект на вершине стека, вызывается метод Push()
. А для того чтобы извлечь и удалить объект из вершины стека, вызывается метод Pop()
. Если же объект требуется только извлечь, но не удалить из вершины стека, то вызывается метод Реек()
. А если вызвать метод Pop()
или Реек()
, когда вызывающий стек пуст, то сгенерируется исключение InvalidOperationException
.
Таблица 25.20. Методы, определенные в классе Stack
Метод – Описание
public T Peek() – Возвращает элемент, находящийся на вершине стека, но не удаляет его
public T Pop() – Возвращает элемент, находящийся на вершине стека, удаляя его в процессе работы
public void Push(Titem) – Помещает элемент item в стек
Public T[] ToArray() – Возвращает массив, содержащий копии элементов вызывающего стека
public void TrimExcess() – Сокращает избыточную емкость вызывающей коллекции в виде стека
В приведенном ниже примере программы демонстрируется применение класса Stack
// Продемонстрировать применение класса Stack
using System;
using System.Collections.Generic;
class GenStackDemo {
static void Main() {
Stack
st.Push(«один»);
st.Push(«два»);
st.Push(«три»);
st.Push(«четыре»);
st.Push(«пять»);
while(st.Count > 0) {
string str = st.Pop();
Console.Write(str + " ");
}
Console.WriteLine();
}
}
При выполнении этой программы получается следующий результат.
пять четыре три два один
Класс Queue
Класс Queue
является обобщенным эквивалентом класса необобщенной коллекции Queue
. В нем поддерживается очередь в виде списка, действующего по принципу «первым пришел – первым обслужен». В этом классе реализуются интерфейсы ICollection, IEnumerable
и IEnumerable
. Кроме того, в классе Queue
непосредственно реализуются методы Clear(), Contains()
и CopyTo()
, определенные в интерфейсе ICollection
. А методы Add()
и Remove()
в этом классе не поддерживаются, как, впрочем, и свойство IsReadOnly
. Коллекция класса Queue
имеет динамический характер, расширяясь по мере необходимости, чтобы вместить все элементы, которые должны храниться в ней. В классе Queue
определяются следующие конструкторы.
public Queue()
public Queue(int capacity)
public Queue(IEnumerable
В первой форме конструктора создается пустая очередь с выбираемой по умолчанию первоначальной емкостью, а во второй форме – пустая очередь, первоначальный размер которой определяет параметр capacity. И в третьей форме создается очередь, содержащая элементы коллекции, определяемой параметром collection. Ее первоначальная емкость равна количеству указанных элементов.
В классе Queue
определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются, а также в интерфейсе ICollection
. Некоторые из наиболее часто используемых методов этого класса перечислены в табл.25.21. Как и в классе Queue
, эти методы обычно применяются следующим образом. Для того чтобы поместить объект в очередь, вызывается метод Enqueue()
. Если требуется извлечь и удалить первый объект из начала очереди, то вызывается метод Dequeue()
. Если же требуется извлечь, но не удалять следующий объект из очереди, то вызывается метод Реек()
. А если методы Dequeue()
и Реек()
вызываются, когда очередь пуста, то генерируется исключение InvalidOperationException
.
Таблица 25.21. Методы, определенные в классе Queue
Метод – Описание
public T Dequeue() – Возвращает объект из начала вызывающей очереди. Возвращаемый объект удаляется из очереди
public void Enqueue (Тitem) – Добавляет элемент item в конец очереди
public T Реек() – Возвращает элемент из начала вызывающей очере_ди, но не удаляет его
public virtual Т[] ToArray() – Возвращает массив, который содержит копии элементов из вызывающей очереди
public void TrimExcess() – Сокращает избыточную емкость вызывающей коллекции в виде очереди
В приведенном ниже примере демонстрируется применение класса Queue
// Продемонстрировать применение класса Queue
using System;
using System.Collections.Generic;
class GenQueueDemo {
static void Main() {
Queue
q.Enqueue(98.6);
q.Enqueue(212.0);
q.Enqueue(32.0);
q.Enqueue(3.1416);
double sum = 0.0;
Console.Write("Очередь содержит: ");
while(q.Count > 0) {
double val = q.Dequeue();
Console.Write(val + " ");
sum += val;.
}
Console.WriteLine("nИтоговая сумма равна " +• sum);
}
}
Вот к какому результату приводит выполнение этой программы.
Очередь содержит: 98.6 212 32 3.1416
Итоговая сумма равна 345.7416
Класс HashSet
В классе HashSet
поддерживается коллекция, реализующая множество. Для хранения элементов этого множества в нем используется хеш-таблица. В классе HashSet
реализуются интерфейсы ICollection
, а также IDeserializationCallback
. В коллекции типа HashSet
реализуется множество, все элементы которого являются уникальными. Иными словами, дубликаты в таком множестве не допускаются. Порядок следования элементов во множестве не указывается. В классе HashSet
определяется полный набор операций с множеством, определенных в интерфейсе I$et
, включая пересечение, объединение и разноименность. Благодаря этому класс HashSet
оказывается идеальным средством для работы с множествами объектов, когда порядок расположения элементов во множестве особого значения не имеет. Коллекция типа HashSet
имеет динамический характер и расширяется по мере необходимости, чтобы вместить все элементы, которые должны в ней храниться.
Ниже перечислены наиболее употребительные конструкторы, определенные в классе HashSet
.
public HashSet()
public HashSet(IEnumerable
public HashSet(IEqualityCompare comparer)
public HashSet(IEnumerable
В первой форме конструктора создается пустое множество, а во второй форме – множество, состоящее из элементов указываемой коллекции collection. В третьей форме конструктора допускается указывать способ сравнения с помощью параметра comparer. А в четвертой форме создается множество, состоящее из элементов указываемой коллекции collection, и используется заданный способ сравнения comparer. Имеется также пятая форма конструктора данного класса, в которой допускается инициализировать множество последовательно упорядоченными данными.
В классе HashSet
реализуется интерфейс ISet
, а следовательно, в нем предоставляется полный набор операций со множествами. В этом классе предоставляется также метод RemoveWhere()
, удаляющий из множества элементы, не удовлетворяющие заданному условию, или предикату.
Помимо свойств, определенных в интерфейсах, которые реализуются в классе HashSet
, в него введено дополнительное свойство Comparer
, приведенное ниже.
public IEqualityComparer
Оно позволяет получать метод сравнения для вызывающего хеш-множества.
Ниже приведен конкретный пример применения класса HashSet
.
// Продемонстрировать применение класса HashSet
using System;
using System.Collections.Generic;
class HashSetDemo {
static void Show(
string msg, HashSet
Console.Write(msg);
foreach(char ch in set)
Console.Write(ch + " ");
Console.WriteLine();
}
static void Main() {
HashSet
HashSet
setA.Add('A');
setA.Add('В');
setA.Add('C');
setB.Add('C');
setB.Add('D');
setB.Add('Е');
Show("Исходное содержимое множества setA: ", setA);
Show("Исходное содержимое множества setB: ", setB);
setA.SymmetricExceptWith(setB);
Show("Содержимое множества setA после " +
"разноименности со множеством SetB: ", setA);
setA.UnionWith(setB);
Show("Содержимое множества setA после " +
"объединения со множеством SetB: ", setA);
setA.ExceptWith(setB);
Show("Содержимое множества setA после " +
"вычитания из множества setB: ", setA);
Console.WriteLine();
}
}
Ниже приведен результат выполнения программы из данного примера.
Исходное содержимое множества setA: A B C