День сто сорок первый. #ЗаметкиНаПолях
Коллекции в C#
2. HashSet<T>
Создание и использование:
- Инициализация:
- Пересечение множеств (изменяет hashSet):
- Симметричная разница (изменяет hashSet), элементы из hashSet или из another, но не из обоих:
Коллекции в 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/