Призначення класу Hashtable — зберігання пар "ключ-значення" для пошуку за ключем.
Загальне уявлення про клас Hashtable можна отримати, переглянувши код програми та проаналізувавши її виведенням для словника, у якому і ключі, і значення мають тип string.
У поданому далі описі:
Зауваження
Ключ не може бути null, але значення може бути.
Об'єкти, які використовують як ключі необхідні для перевизначення методу Object.GetHashCode (або інтерфейсу IHashCodeProvider) та методу Object.Equals (або інтерфейсу IComparer). Реалізація цих методів та інтерфейсів повинна обробляти чутливість регістру однаково, інакше поведінка може бути неправильно. Наприклад, при створенні класу Hashtable необхідно використовувати CaseInsensitiveHashCodeProvider клас (або будь-яке втілення IHashCodeProvider без урахування регістру) з класом CaseInsensitiveComparer (або будь-яаміке втілення IComparer без урахування регістру).
Крім того, ці методи повинні отримувати ті самі результати під час виклику з тими самими параметрами, коли ключ існує в Hashtable. Альтернативою є використання конструктора Hashtable з параметром IEqualityComparer. Якби ключова рівність була просто еталонною рівністю, успадковане втілення Object.GetHashCode та Object.Equals буде достатнім.
Об'єкти мають бути незмінними, якщо їх використовують як ключі в Hashtable.
Коли додають елемент, його розташовують у контейнер на основі хеш-коду ключа. Наступні пошуки ключа використовують хеш-код ключа для пошуку лише в одному конкретному контейнері, що значно скорочує кількість порівнянь ключів, необхідних для пошуку елемента.
Коефіцієнт навантаження — відношення кількості елементів до кількості контейнерів. Малі значення коефіцієнтів призводять до прискорення середнього часу пошуку за рахунок збільшення використання пам'яті. При створенні також можна вказати інший коефіцієнт навантаження.
При додаванні елементів фактичний коефіцієнт навантаження зростає. Коли він досягає досягає вказаного значення, число контейнерів автоматично збільшується до найменшого простого числа, яке перевищує удвічі поточну кілкість контейнерів.
Кожен об'єкт ключа має надавати власну хеш-функцію, доступ до якої можна отримати шляхом виклику GetHash. Будь-який об'єкт, що втілює IHashCodeProvider, можна передати конструктору Hashtable, і цю хеш-функцію використовують для всіх об'єктів у таблиці.
Місткість об'єкта Hashtable — це кількість елементів, які він може містити без перебудови. При додаванні елементів ємність автоматично буде збільшено при потребі.
Лише платформа .NET Framework. Для великих об'єктів можна збільшити максимальну ємність до 2 мільярдів елементів у 64-розрядній системі, надавши значення true властивості <gcAllowVeryLargeObjects> елемента конфігурації в середовищі виконання.
Оператор foreach є оболонкою перелічувача, який дозволяє лише зчитувати з колекції, а не записувати до неї.
Серіалізація та десеріалізація перелічувача може призвести до переупорядкування елементів, тому неможливо продовжити перерахування без виклику Reset методу.
Ключі можуть успадковуватись зі зміненою поведінкою, тому їх абсолютна унікальність не може бути гарантована порівнянням за допомогою методу Equals у цьому випадку.
Hashtable<TKey, TValue>() — ініціалізує новий порожній представник класу, що має початкову ємність як усталено і використовує функцію порівняння як усталено.
Hashtable<TKey, TValue> (IHashtable<TKey, TValue>) — ініціалізує новий представник класу, який містить елементи, скопійовані з колекції IHashtable<TKey, TValue>, та використовує функцію порівняння як усталено.
Hashtable<TKey, TValue> (IHashtable<TKey, TValue>, IEqualityComparer<TKey>) — ініціалізує новий екземпляр класу, який містить елементи, скопійовані з колекції IHashtable<TKey,TValue>, та використовує вказаний інтерфейс IEqualityComparer<T>.
Hashtable<TKey, TValue> (IEnumerable<KeyValuePair<TKey, TValue>>) — ініціалізує новий екземпляр класу, який містить елементи, скопійовані з об'єкта IEnumerable<T>.
Hashtable<TKey, TValue> (IEnumerable<KeyValuePair<TKey, TValue>>, IEqualityComparer<TKey>) — ініціалізує новий екземпляр класу, який містить елементи, скопійовані зі словника IEnumerable<T>, та використовує порівнювач IEqualityComparer<T>.
Hashtable<TKey, TValue> (IEqualityComparer<TKey>) — ініціалізує новий порожній екземпляр класу з початковою ємністю як усталено, який використовує вказану функцію порівняння IEqualityComparer<T>.
Hashtable<TKey, TValue> (Int32) — ініціалізує новий порожній екземпляр класу, що має задану початкову ємність і використовує функцію порівняння як усталено, що перевіряє рівність для цього типу ключа.
Hashtable<TKey, TValue> (Int32, IEqualityComparer<TKey>) — ініціалізує новий порожній екземпляр класу із заданою початковою ємністю, який використовує вказану функцію порівняння IEqualityComparer<T>.
Hashtable<TKey,TValue>(SerializationInfo, StreamingContext) — ініціалізує новий екземпляр класу із серіалізованими даними.
Властивості
Методи
Додаткові дані про явні втілення інтерфейсу, методи розширення потоко-безпечність подано на сторінці сайту learn.microsoft.com.