Множества: классы HashSet и SortedSet
Коллекция, содержащая только отличающиеся элементы, называется множеством (set). В составе .NET 4 имеются два множества — HashSet<T> и SortedSet<T>. Оба они реализуют интерфейс ISet<T>. Класс HashSet<T> содержит неупорядоченный список различающихся элементов, а в SortedSet<T> элементы упорядочены.
Интерфейс ISet<T> предоставляет методы для создания объединения нескольких множеств, пересечения множеств и определения, является ли одно множество надмножеством или подмножеством другого.
Ниже перечислены наиболее употребительные конструкторы, определенные в классе HashSet<T>:
public HashSet () public HashSet(IEnumerable<T> collection) public HashSet(IEqualityCompare comparer) public HashSet(IEnumerable<T> collection, IEqualityCompare comparer)
В первой форме конструктора создается пустое множество, а во второй форме — множество, состоящее из элементов указываемой коллекции collection. В третьей форме конструктора допускается указывать способ сравнения с помощью параметра comparer. А в четвертой форме создается множество, состоящее из элементов указываемой коллекции collection, и используется заданный способ сравнения comparer. Имеется также пятая форма конструктора данного класса, в которой допускается инициализировать множество последовательно упорядоченными данными.
В этом классе предоставляется также метод RemoveWhere(), удаляющий из множества элементы, удовлетворяющие заданному условию, или предикату. Помимо свойств, определенных в интерфейсах, которые реализуются в классе HashSet<T>, в него введено дополнительное свойство Comparer, приведенное ниже:
public IEqualityComparer<T> Comparer { get; }
Оно позволяет получать метод сравнения для вызывающего хеш-множества.
Ниже перечислены четыре наиболее часто используемых конструкторов, определенных в классе SortedSet<T>:
public SortedSet() public SortedSet(IEnumerable<T> collection) public SortedSet(IComparer comparer) public SortedSet(IEnumerable<T> collection, IComparer comparer)
В первой форме конструктора создается пустое множество, а во второй форме — множество, состоящее из элементов указываемой коллекции collection. В третьей форме конструктора допускается указывать способ сравнения с помощью параметра comparer. А в четвертой форме создается множество, состоящее из элементов указываемой коллекции collection, и используется заданный способ сравнения comparer. Имеется также пятая форма конструктора данного класса, в которой допускается инициализировать множество последовательно упорядоченными данными.
В этом классе предоставляется также метод GetViewBetween(), возвращающий часть множества в форме объекта типа SortedSet<T>, метод RemoveWhere(), удаляющий из множества элементы, не удовлетворяющие заданному условию, или предикату, а также метод Reverse(), возвращающий объект типа IEnumerable<T>, который циклически проходит множество в обратном порядке.
Помимо свойств, определенных в интерфейсах, которые реализуются в классе SortedSet<T>, в него введены дополнительные свойства, приведенные ниже:
public IComparer<T> Comparer { get; } public T Max { get; } public T Min { get; }
Свойство Comparer получает способ сравнения для вызывающего множества. Свойство Мах получает наибольшее значение во множестве, а свойство Min — наименьшее значение во множестве. Давайте рассмотрим пример использования множеств:
using System; using System.Collections.Generic; namespace ConsoleApplication1 { class Program { static void Main() { // Создадим два множества SortedSet<char> ss = new SortedSet<char>(); SortedSet<char> ss1 = new SortedSet<char>(); ss.Add('A'); ss.Add('B'); ss.Add('C'); ss.Add('Z'); ShowColl(ss, "Первая коллекция: "); ss1.Add('X'); ss1.Add('Y'); ss1.Add('Z'); ShowColl(ss1, "Вторая коллекция"); ss.SymmetricExceptWith(ss1); ShowColl(ss,"Исключили разноименность (одинаковые элементы) двух множеств: "); ss.UnionWith(ss1); ShowColl(ss, "Объединение множеств: "); ss.ExceptWith(ss1); ShowColl(ss, "Вычитание множеств"); Console.ReadLine(); } static void ShowColl(SortedSet<char> ss, string s) { Console.WriteLine(s); foreach (char ch in ss) Console.Write(ch + " "); Console.WriteLine("\n"); } } }
Комментарии