Різниця між словником і хешбелом

Словник проти Hashtable

Словник вводиться (s valuetypes не потребує bxx), Hashtable не (s valuetypes потрібно bxx). Hashtable має кращий спосіб отримання значення, ніж словник IMHO, тому що він завжди значить, що значення є об'єктом. Думаю, якщо ви використовуєте .NET 3.5, легко написати розширення для словника, щоб отримати подібне поведінку.

Клас Hashtable - це специфічний тип словника класу, який використовує ціле значення (зване хеш), щоб допомогти у сховищах його ключів. Клас Hashtable використовує хеш для прискорення пошуку певного ключа в колекції. Кожен об’єкт у .NET походить з класу Object. Цей клас підтримує метод GetHash, який повертає ціле число, яке однозначно ідентифікує об'єкт. Клас Hashtable - це дуже ефективний колекціонер взагалі. Єдиною проблемою для класу Hashtable є те, що для нього потрібно трохи над головою, а також для маленьких колекціонів (менше ніж десять елементів) над голова може перешкоджати виконанню.

Існує одна важлива різниця між HashTable і словником. Якщо ви використовуєте індексатори, щоб отримати значення для HashTable, HashTable буде успішно повернути нуль для неіснуючого елемента, тоді як словник помилиться помилково, якщо ви спробуєте отримати доступ до елемента за допомогою індексатора, який не існує в словнику.

HashTable є слабко набраним базовим класом; абстрактний клас DictionaryBase строго набраний і використовує внутрішньо HashTable.

Дивна річ, помічена навколо Словника, коли ми додаємо кілька записів у словник, зберігається ордер, в який додаються записи. Таким чином, якщо застосувати наступний словник до словника, ви отримаєте recorrds у тому ж порядку, де ви їх вставили. В той час, як це не відповідає правильному HashTable, коли ви додаєте однакові записи в Hashtable, ордер не підтримується. Якщо "Словник заснований на Hashtable" є істинним, чому словник підтримує ордер, але HashTable не існує?

Оскільки вони поводяться по-різному, це тому, що Generic Dictionary реалізує хешбел, але не заснований на System.Cоllectiоns.Hashtable. Реалізація «Загального словника» базується на використанні пар ключів-значень зі списку. Потім вони індексуються відрізками хештету для доступу до рандому, але коли він повертає нумерацію, він просто переходить список у послідовному ордері - який буде іншим вставкою настільки довше, як записи більше не використовуються.