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), це також робить його ідеальним для подібних речей.