355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Герберт Шилдт » C# 4.0: полное руководство » Текст книги (страница 78)
C# 4.0: полное руководство
  • Текст добавлен: 6 апреля 2017, 04:00

Текст книги "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, ICollection, ICollection>, IEnumerable, IEnumerable>, ISerializable и IDeserializationCallback. В двух последних интерфейсах поддерживается сериализация списка. Словари имеют динамический характер, расширяясь по мере необходимости.

В классе Dictionary предоставляется немало конструкторов. Ниже перечислены наиболее часто используемые из них.

public Dictionary()

public Dictionary(IDictionaryCTKey, TValue> dictionary)

public Dictionary(int capacity)

В первом конструкторе создается пустой словарь с выбираемой по умолчанию первоначальной емкостью. Во втором конструкторе создается словарь с указанным количеством элементов dictionary. А в третьем конструкторе с помощью параметра capaci ty указывается емкость коллекции, создаваемой в виде словаря. Если размер словаря заранее известен, то, указав емкость создаваемой коллекции, можно исключить изменение размера словаря во время выполнения, что, как правило, требует дополнительных затрат вычислительных ресурсов.

В классе Dictionary определяется также ряд методов. Некоторые наиболее часто используемые методы этого класса сведены в табл. 25.17.

Таблица 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 Comparer { get; } – Получает метод сравнения для вызывающего словаря

public Dictionary. KeyCollection Keys { get; } – Получает коллекцию ключей

public Dictionary. ValueCollection Values { get; } – Получает коллекцию значений

Следует иметь в виду, что ключи и значения, содержащиеся в коллекции, доступны отдельными списками с помощью свойств Keys и Values. В коллекциях типа DictionaryCTKey, TValue>.KeyCollection и Dictionary.ValueCollection> реализуются как обобщенные, так и необобщенные формы интерфейсов 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 diet =

            new Dictionary();

    // Добавить элементы в коллекцию,

    diet.Add(«Батлер, Джон», 73000);

    diet.Add(«Шварц, Capa», 59000);

    diet.Add(«Пайк, Томас», 45000);

    diet.Add(«Фрэнк, Эд», 99000);

    // Получить коллекцию ключей, т.е. фамилий и имен.

    ICollection с = diet.Keys;

    // Использовать ключи для получения значений, т.е. зарплаты,

    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, ICollection, ICollection>, IEnumerable и IEnumerable>. В классе SortedDictionary предоставляются также следующие конструкторы.

public SortedDictionary()

public SortedDictionary(IDictionary dictionary)

public SortedDictionary(IComparer comparer)

public SortedDictionary(IDictionaryCTKey, TValue> dictionary,

                   IComparer comparer)

В первом конструкторе создается пустой словарь, во втором конструкторе – словарь с указанным количеством элементов 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 Comparer { get; } – Получает метод сравнения для вызывающего словаря

public SortedDictionary.KeyCollection Keys { get; } – Получает коллекцию ключей

public SortedDictionary.ValueCollection Values { get; } – Получает коллекцию значений

Следует иметь в виду, что ключи и значения, содержащиеся в коллекции, доступны отдельными списками с помощью свойств Keys и Values. В коллекциях типа SortedDictionary.KeyCollection и SortedDictionary.ValueCollection реализуются как обобщенные, так и необобщенные формы интерфейсов 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 diet =

          new SortedDictionary();

    // Добавить элементы в коллекцию,

    diet.Add(«Батлер, Джон», 73000);

    diet.Add(«Шварц, Capa», 59000);

    diet.Add(«Пайк, Томас», 45000);

    diet.Add(«Фрэнк, Эд», 99000);

    // Получить коллекцию ключей, т.е. фамилий и имен.

    ICollection с = diet.Keys;

    // Использовать ключи для получения значений, т.е. зарплаты,

    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, ICollection, ICollection>, IEnumerable и IEnumerable>. Размер коллекции типа SortedList изменяется динамически, автоматически увеличиваясь по мере необходимости. Класс SortedList подобен классу SortedDictionary, но у него другие рабочие характеристики. В частности, класс SortedList использует меньше памяти, тогда как класс SortedDictionary позволяет быстрее вставлять неупорядоченные элементы в коллекцию.

В классе SortedListcTKey, TValue> предоставляется немало конструкторов. Ниже перечислены наиболее часто используемые конструкторы этого класса.

public SortedList()

public SortedList(IDictionaryCTKey, TValue> dictionary)

public SortedList(int capacity)

public SortedList(IComparer comparer)

В первой форме конструктора создается пустой список с выбираемой по умолчанию первоначальной емкостью. Во второй форме конструктора создается отсортированный список с указанным количеством элементов 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> GetEnumerator()Возвращает перечислитель для вызывающего словаря

 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 Comparer { get; } - Получает метод сравнения для вызывающего списка

public IList Keys { get; } – Получает коллекцию ключей

public IList Values { get; } – Получает коллекцию значений

И наконец, в классе 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 sl =

         new SortedList();

    // Добавить элементы в коллекцию,

    sl.Add(«Батлер, Джон», 73000);

    sl.Add(«Шварц, Capa», 59000);

    sl.Add(«Пайк, Томас», 45000);

    sl.Add(«Фрэнк, Эд», 99000);

    // Получить коллекцию ключей, т.е. фамилий и имен.

    ICollection с = sl.Keys;

    // Использовать ключи для получения значений, т.е. зарплаты,

    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 collection)

В первой форме конструктора создается пустой стек с выбираемой по умолчанию первоначальной емкостью, а во второй форме – пустой стек, первоначальный размер которого определяет параметр 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 = new 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 collection)

В первой форме конструктора создается пустая очередь с выбираемой по умолчанию первоначальной емкостью, а во второй форме – пустая очередь, первоначальный размер которой определяет параметр 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 = new 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, ISet, IEnumerable, IEnumerable, ISerializable, а также IDeserializationCallback. В коллекции типа HashSet реализуется множество, все элементы которого являются уникальными. Иными словами, дубликаты в таком множестве не допускаются. Порядок следования элементов во множестве не указывается. В классе HashSet определяется полный набор операций с множеством, определенных в интерфейсе I$et, включая пересечение, объединение и разноименность. Благодаря этому класс HashSet оказывается идеальным средством для работы с множествами объектов, когда порядок расположения элементов во множестве особого значения не имеет. Коллекция типа HashSet имеет динамический характер и расширяется по мере необходимости, чтобы вместить все элементы, которые должны в ней храниться.

Ниже перечислены наиболее употребительные конструкторы, определенные в классе HashSet.

public HashSet()

public HashSet(IEnumerable collection)

public HashSet(IEqualityCompare comparer)

public HashSet(IEnumerable collection, IEqualityCompare comparer)

В первой форме конструктора создается пустое множество, а во второй форме – множество, состоящее из элементов указываемой коллекции collection. В третьей форме конструктора допускается указывать способ сравнения с помощью параметра comparer. А в четвертой форме создается множество, состоящее из элементов указываемой коллекции collection, и используется заданный способ сравнения comparer. Имеется также пятая форма конструктора данного класса, в которой допускается инициализировать множество последовательно упорядоченными данными.

В классе HashSet реализуется интерфейс ISet, а следовательно, в нем предоставляется полный набор операций со множествами. В этом классе предоставляется также метод RemoveWhere(), удаляющий из множества элементы, не удовлетворяющие заданному условию, или предикату.

Помимо свойств, определенных в интерфейсах, которые реализуются в классе HashSet, в него введено дополнительное свойство Comparer, приведенное ниже.

public IEqualityComparer Comparer { get; }

Оно позволяет получать метод сравнения для вызывающего хеш-множества.

Ниже приведен конкретный пример применения класса HashSet.

// Продемонстрировать применение класса HashSet.

using System;

using System.Collections.Generic;

class HashSetDemo {

  static void Show( string msg, HashSet set) {

    Console.Write(msg);

    foreach(char ch in set)

      Console.Write(ch + " ");

    Console.WriteLine();

  }

  static void Main() {

    HashSet setA = new HashSet();

    HashSet setB = new 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


    Ваша оценка произведения:

Популярные книги за неделю