День сто сорок первый. #ЗаметкиНаПолях

Коллекции в C#

2. HashSet<T>

HashSet представляет набор уникальных элементов, как математическое множество (например, {1, 2, 3}). Набор не может содержать дубликаты, а порядок элементов не имеет значения, т.е. {1, 2, 3} и {3, 2, 1} равны.

HashSet используется, когда вам нужен быстрый поиск в наборе уникальных элементов. Например, при обработке списка заказов для каждого заказа вам нужно быстро проверить, входит ли код поставщика в список корректных кодов.

HashSet, похож на Dictionary, представляет собой коллекцию на основе хеша, поэтому поиск выполняется очень быстро за время O(1). Но, в отличие от словаря, он хранит только значения без ключей. Таким образом, каждый объект должен быть уникальным, и это определяется по GetHashCode. Т.е., если вы собираетесь хранить пользовательские типы в наборе, вам необходимо переопределить методы GetHashCode и Equals в вашем типе.



Создание и использование:

- Инициализация:

var hashSet = new HashSet<int>() { 1, 2, 3 };

- Добавление:

hashSet.Add(4);

- Удаление:

hashSet.Remove(3);

- Очистка:

hashSet.Clear();

- Проверка наличия элемента:

var contains = hashSet.Contains(1);

- Количество элементов:

var count = hashSet.Count;



HashSet предоставляет набор математических операций для работы с множествами. Следующие методы имеют аналоги в LINQ для любых коллекций IEnumerable<T>:

- Пересечение множеств (изменяет hashSet):

hashSet.IntersectWith(another);

- Объединение множеств (изменяет hashSet):

hashSet.UnionWith(another);

- Удаляет все элементы another из hashSet:

hashSet.ExceptWith(another);



Следующие методы НЕ имеют аналогов в LINQ для обычных коллекций:

- Симметричная разница (изменяет hashSet), элементы из hashSet или из another, но не из обоих:

hashSet.SymmetricExceptWith(another);

- Является ли hashSet надмножеством another:

var isSupersetOf = hashSet.IsSupersetOf(another);

- Является ли hashSet строгим надмножеством another:

var isSupersetOf = hashSet.IsProperSupersetOf(another);

- Является ли hashSet подмножеством another:

var isSubsetOf = hashSet.IsSubsetOf(another);

- Является ли hashSet строгим подмножеством another:

var isSubsetOf = hashSet.IsProperSubsetOf(another);

- Содержит ли hashSet те же элементы, что и another:

var equals = hashSet.SetEquals(another);

- Есть ли у hashSet и another одинаковые элементы:

var overlaps = hashSet.Overlaps(another); 



Источник: https://programmingwithmosh.com/net/csharp-collections/