HashSet Структура данных C # HashSet была представлена в .NET Framework 3.5. Полный список реализованных участников можно найти на странице HashSet MSDN .
- Где это используется?
- Почему вы хотите использовать это?
HashSet Структура данных C # HashSet была представлена в .NET Framework 3.5. Полный список реализованных участников можно найти на странице HashSet MSDN .
Ответы:
A HashSet
содержит набор объектов, но позволяет легко и быстро определить, находится ли объект в наборе или нет. Это достигается за счет внутреннего управления массивом и сохранения объекта с использованием индекса, который вычисляется из хеш-кода объекта. Посмотрите здесь
HashSet
неупорядоченная коллекция, содержащая уникальные элементы Он имеет стандартные операции сбора Add, Remove, Contains, но поскольку он использует реализацию на основе хеша, эти операции являются O (1). (В отличие от List, например, O (n) для Contains и Remove.) HashSet
Также предоставляет стандартные операции над множествами, такие как объединение , пересечение и симметричная разность . Посмотрите здесь
Существуют разные реализации множеств. Некоторые делают операции вставки и поиска очень быстрыми за счет хэширования элементов. Однако это означает, что порядок добавления элементов теряется. Другие реализации сохраняют добавленный порядок за счет более медленного времени выполнения.
HashSet
Класс в C # идет на первый подход, таким образом , не сохраняя порядок элементов. Это намного быстрее, чем обычный 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>
, но оптимизирован для быстрого поиска (через хеш-таблицы, как следует из названия) за счет потери порядка.
С точки зрения приложения, если вам нужно только избежать дубликатов, то HashSet
это то, что вы ищете, поскольку сложности поиска, вставки и удаления имеют O (1) -константу . Это означает, что не имеет значения, сколько элементов HashSet
имеет, потребуется столько же времени, чтобы проверить, есть ли такой элемент или нет, плюс, поскольку вы вставляете элементы в O (1), это делает его идеальным для такого рода вещей.