C# 4.0 полное руководство - 2011 - Герберт Шилдт
Шрифт:
Интервал:
Закладка:
HashSet<T> имеет динамический характер и расширяется по мере необходимости, чтобы вместить все элементы, которые должны в ней храниться.
Ниже перечислены наиболее употребительные конструкторы, определенные в классе HashSet<T>.
public -HashSetO
public HashSet(IEnumerable<T> collection) public HashSet(IEqualityCompare comparer)
public HashSet(IEnumerable<T> collection, IEqualityCompare comparer)
В первой форме конструктора создается пустое множество, а во второй форме — множество, состоящее из элементов указываемой коллекции collection. В третьей форме конструктора допускается указывать способ сравнения с помощью параметра comparer. А в четвертой форме создается множество, состоящее из элементов указываемой коллекции collection, и используется заданный способ сравнения comparer. Имеется также пятая форма конструктора данного класса, в которой допускается инициализировать множество последовательно упорядоченными данными.
В классе HashSet<T> реализуется интерфейс ISet<T>, а следовательно, в нем предоставляется полный набор операций со множествами. В этом классе предоставляется также метод RemoveWhere (), удаляющий из множества элементы, не удовлетворяющие заданному условию, или предикату.
Помимо свойств, определенных в интерфейсах, которые реализуются в классе HashSet<T>, в него введено дополнительное свойство Comparer, приведенное ниже.
public IEqualityComparer<T> Comparer { get; }
Оно позволяет получать метод сравнения для вызывающего хеш-множества.
Ниже приведен конкретный пример применения класса HashSet<T>.
// Продемонстрировать применение класса HashSet<T>. using System;
using System.Collections.Generic;
class HashSetDemo {
static void Show(string msg, HashSet<char> set) {
Console.Write(msg); foreach(char ch in set)
Console.Write(ch + " ");
Console.WriteLine ();
}
static void Main() {
HashSet<char> setA = new HashSet<char> ();
HashSet<char> setB = new HashSet<char> ();
setA.Add('A'); setA.Add(' В'); setA.Add('C') ;
setB.Add('С') ; setB.Add(' D1 );
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: ABC Исходное содержимое множества setB: С D Е
Содержимое множества setA после разноименности со множеством SetB: А В D Е Содержимое множества setA после объединения со множеством SetB: А В D Е С Содержимое множества setA после вычитания из множества setB: А В
Класс SortedSet<T>
Класс SortedSet<T> представляет собой новую разновидность коллекции, введенную в версию 4.0 среды .NET Framework. В нем поддерживается коллекция, реализующая отсортированное множество. В классе SortedSet<T> реализуются интерфейсы ISet<T>, ICollection, ICollection<T>, IEnumerable, IEnumerable<T>, ISerializable, а также IDeserializationCallback. В коллекции типа SortedSet<T> реализуется множество, все элементы которого являются уникальными. Иными словами, дубликаты в таком множестве не допускаются. В классе SortedSet<T> определяется полный набор операций с множеством, определенных в интерфейсе ISet<T>, включая пересечение, объединение и разноименность. Благодаря тому что все элементы коллекции типа SortedSet<T> сохраняются в отсортированном порядке, класс SortedSet<T> оказывается идеальным средством для работы с отсортированными множествами объектов. Коллекция типа SortedSet<T> имеет динамический характер и расширяется по мере необходимости, чтобы вместить все элементы, которые должны в ней храниться.
Ниже перечислены четыре наиболее часто используемые конструктора, определенных в классе SortedSet<T>.
public SortedSetO
public SortedSet(IEnumerable<T> collection) public SortedSet(IComparer comparer)
public SortedSet(IEnumerable<T> collection, IComparer comparer)
В первой форме конструктора создается пустое множество, а во второй форме — множество, состоящее из элементов указываемой коллекции collection. В третьей форме конструктора допускается указывать способ сравнения с помощью параметра comparer. А в четвертой форме создается множество, состоящее из элементов указываемой коллекции collection, и используется заданный способ сравнения comparer. Имеется также пятая форма конструктора данного класса, в которой допускается инициализировать множество последовательно упорядоченными данными.
В классе SortedSet<T> реализуется интерфейс ISet<T>, а следовательно, в нем предоставляется полный набор операций со множествами. В этом классе предоставляется также метод GetViewBetween (), возвращающий часть множества в форме объекта типа SortedSet<T>, метод RemoveWhere (), удаляющий из множества элементы, не удовлетворяющие заданному условию, или предикату, а также метод Reverse (), возвращающий объект типа IEnumerable<T>, который циклически проходит множество в обратном порядке.
Помимо свойств, определенных в интерфейсах, которые реализуются в классе SortedSet<T>, в него введены дополнительные свойства, приведенные ниже.
public IComparer<T> Comparer { get; } public T Max { get; } public T Min { get; }
Свойство Comparer получает способ сравнения для вызывающего множества. Свойство Мах получает наибольшее значение во множестве, а свойство Min — наименьшее значение во множестве.
В качестве примера применения класса SortedSet<T> на практике просто замените обозначение HashSet на SortedSet в исходном коде программы из предыдущего подраздела, посвященного коллекциям типа HashSet<T>.
Параллельные коллекции
В версию 4.0 среды .NET Framework добавлено новое пространство имен System. Collections . Concurrent. Оно содержит коллекции, которые являются потокобезопасными и специально предназначены для параллельного программирования. Это означает, что они могут безопасно использоваться в многопоточной программе, где возможен одновременный доступ к коллекции со стороны двух или больше параллельно исполняемых потоков. Ниже перечислены классы параллельных коллекций.
Параллельная коллекция
Описание
BlockingCollection<T>
Предоставляет оболочку для блокирующей реализации интерфейса IProducerConsumerCollection<T>
ConcurrentBag<T>
Обеспечивает неупорядоченную реализацию интерфейса
IProducerConsumerCollection<T>, которая оказыва
ется наиболее пригодной в том случае, когда информация вырабатывается и потребляется в одном потоке
ConcurrentDictionary
Сохраняет пары “ключ-значение", а значит, реализует парал
<TKey, TValue>
лельный словарь
ConcurrentQueue<T>
Реализует параллельную очередь и соответствующий вариант интерфейса IProducerConsumerCollection<T>
ConcurrentStack<T>
Реализует параллельный стек и соответствующий вариант интерфейса IproducerConsumerCollection<T>
Как видите, в нескольких классах параллельных коллекций реализуется интерфейс IProducerConsumerCollection. Этот интерфейс также определен в пространстве имен System. Collections . Concurrent. Он служит в качестве расширения интерфейсов IEnumerable, IEnumerable<T> и ICollection. Кроме того, в нем определены методы TryAdd () и TryTake (), поддерживающие шаблон "поставщик-потребитель". (Классический шаблон "поставщик-потребитель" отличается решением двух задач. Первая задача производит элементы коллекции, а другая потребляет их.) Метод TryAdd () пытается добавить элемент в коллекцию, а метод TryTake () — удалить элемент из коллекции. Ниже приведены формы объявления обоих методов.