HashSet Структура данных С# HashSet была представлена в .NET Framework 3.5. Полный список реализованных элементов можно найти на странице HashSet MSDN.
- Где он используется?
- Почему вы хотите использовать его?
HashSet Структура данных С# HashSet была представлена в .NET Framework 3.5. Полный список реализованных элементов можно найти на странице HashSet MSDN.
A HashSet
содержит набор объектов, но позволяет легко и быстро определить, находится ли объект уже в наборе или нет. Он делает это, внутренне управляя массивом и сохраняя объект, используя индекс, который вычисляется из хэш-кода объекта. Посмотрите здесь
HashSet
- неупорядоченный набор, содержащий уникальные элементы. Он имеет стандартные операции коллекции Add, Remove, Contains, но поскольку он использует хэш-реализацию, эти операции O (1). (В отличие от List, например O (n) для Contains и Remove.) HashSet
также предоставляет стандартные операции набора, такие как объединение, пересечение и симметричная разность. Возьмите посмотрите здесь
Существуют различные реализации наборов. Некоторые делают операции ввода и поиска сверхбыстрыми элементами хэширования. Однако это означает, что порядок, в котором были добавлены элементы, теряется. Другие реализации сохраняют добавленный заказ за счет более медленного времени работы.
Класс HashSet
в С# идет для первого подхода, таким образом не, сохраняя порядок элементов. Это намного быстрее, чем обычный List
. Некоторые базовые тесты показали, что HashSet прилично быстрее работает с первичными типами (int, double, bool и т.д.). Это намного быстрее при работе с объектами класса. Таким образом, точка HashSet быстрая.
Единственный улов HashSet
заключается в отсутствии доступа по индексам. Для доступа к элементам вы можете либо использовать счетчик, либо использовать встроенную функцию для преобразования HashSet
в List
и повторить это. Посмотрите здесь
A HashSet
имеет внутреннюю структуру (хеш), где элементы можно быстро найти и идентифицировать. Недостатком является то, что итерация через HashSet
(или получение элемента по индексу) происходит довольно медленно.
Итак, почему кто-то хочет знать, существует ли запись в наборе?
Одна из ситуаций, когда a HashSet
полезна, заключается в получении различных значений из списка, в котором могут существовать дубликаты. После добавления элемента в HashSet
быстро определить, существует ли элемент (оператор Contains
).
Другими преимуществами HashSet
являются операции Set: IntersectWith
, IsSubsetOf
, IsSupersetOf
, Overlaps
, SymmetricExceptWith
, UnionWith
.
Если вы знакомы с языком ограничения объектов, то вы будете идентифицировать эти операции набора. Вы также увидите, что это на один шаг ближе к реализации исполняемого UML.
Просто сказано и не раскрывает кухонные секреты:
набор в общем случае представляет собой набор, который не содержит повторяющихся элементов и элементы которого не имеют особого порядка. Таким образом, A HashSet<T>
похож на общий List<T>
, но оптимизирован для быстрого поиска (через hashtables, как следует из названия) за счет потери порядка.
С точки зрения приложения, если нужно избегать дубликатов, тогда HashSet
- это то, что вы ищете, так как сложность поиска, вставки и удаления - это O (1) - constant. Это означает, что не имеет значения, сколько элементов HashSet
потребуется для того, чтобы проверить, есть ли такой элемент или нет, плюс, поскольку вы вставляете элементы в O (1) тоже, это делает его идеальным для такого рода вещь.