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), это делает его идеальным для такого рода вещей.источник