HashSet Структура даних C # HashSet була представлена в .NET Framework 3.5. Повний список реалізованих членів можна знайти на сторінці HashSet MSDN .
- Де він використовується?
- Чому б ви хотіли ним користуватися?
HashSet Структура даних C # HashSet була представлена в .NET Framework 3.5. Повний список реалізованих членів можна знайти на сторінці HashSet MSDN .
Відповіді:
A HashSet
містить набір об'єктів, але таким чином, що дозволяє легко і швидко визначити, об’єкт вже в наборі чи ні. Це робиться за допомогою внутрішнього управління масивом і зберігання об'єкта за допомогою індексу, який обчислюється з хеш-коду об'єкта. Погляньте тут
HashSet
це не упорядкована колекція, що містить унікальні елементи. У ньому є стандартні операції збору «Додати, видалити», «містить», але оскільки він використовує хеш-реалізацію, ці операції є O (1). (На відміну, наприклад, від List, який є O (n) для Contains and Remove.) HashSet
Також забезпечує операції стандартного набору, такі як об'єднання , перетин та симетрична різниця . Погляньте тут
Існують різні реалізації наборів. Деякі роблять операції з вставки та пошуку дуже швидкими хеш-елементами. Однак це означає, що порядок додавання елементів втрачається. Інші реалізації зберігають доданий порядок за рахунок більш повільного часу роботи.
HashSet
Клас в C # йде на перший підхід, таким чином , НЕ зберігаючи порядок елементів. Це набагато швидше, ніж звичайний List
. Деякі основні орієнтири показали, що HashSet є пристойно швидшим при роботі з первинними типами (int, double, bool тощо). Це набагато швидше при роботі з об’єктами класу. Отже, це в тому, що HashSet швидкий.
Єдине відгадка HashSet
- це відсутність доступу за показниками. Для доступу до елементів ви можете або використовувати перечислювач, або використовувати вбудовану функцію для перетворення HashSet
в а List
та повторення через це. Погляньте тут
А 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), це також робить його ідеальним для подібних речей.