Поделиться через


Типы коллекций хеш-таблиц и словарей

Класс System.Collections.Hashtable и универсальные System.Collections.Generic.Dictionary<TKey,TValue>System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> классы реализуют System.Collections.IDictionary интерфейс. Универсальный Dictionary<TKey,TValue> класс также реализует универсальный IDictionary<TKey,TValue> интерфейс. Таким образом, каждый элемент в этих коллекциях является парой "ключ-значение".

Hashtable Объект состоит из контейнеров, содержащих элементы коллекции. Корзина — это виртуальная подгруппа элементов внутри Hashtable, что упрощает и ускоряет поиск и извлечение по сравнению с большинством коллекций. Каждый контейнер связан с хэш-кодом, который создается с помощью хэш-функции и основан на ключе элемента.

Универсальный HashSet<T> класс — это неупорядоченная коллекция для хранения уникальных элементов.

Хэш-функция — это алгоритм, который возвращает числовый хэш-код на основе ключа. Ключ — это значение некоторого свойства хранимого объекта. Хэш-функция всегда должна возвращать один хэш-код для одного и того же ключа. Хэш-функция может создать один хэш-код для двух разных ключей, но если хэш-функция создает уникальный хэш-код для каждого ключа, это ведет к повышению производительности при получении элементов из хэш-таблицы.

Каждый объект, используемый в качестве элемента в объекте Hashtable , должен иметь возможность создавать хэш-код для себя с помощью реализации GetHashCode метода. Однако можно также указать хэш-функцию для всех элементов в Hashtable, используя конструктор Hashtable, который принимает реализацию IHashCodeProvider в качестве одного из параметров.

При добавлении объекта в Hashtable, он сохраняется в контейнере, который связан с хэш-кодом, совпадающим с хэш-кодом объекта. При поиске значения в Hashtable генерируется хэш-код для этого значения, и выполняется поиск контейнера, связанного с этим хэш-кодом.

Например, хэш-функция для строки может принимать коды ASCII каждого символа в строке и добавлять их вместе для создания хэш-кода. Строка "пикник" будет иметь хэш-код, отличный от хэш-кода для строки "корзина"; таким образом, строки "пикник" и "корзина" будут находиться в разных контейнерах. Напротив, "stressed" и "десерты" будут иметь тот же хэш-код и будут находиться в одном контейнере.

Классы Dictionary<TKey,TValue> имеют те же функции, что ConcurrentDictionary<TKey,TValue> и Hashtable классы. Определенный тип Dictionary<TKey,TValue> (отличающийся от Object) обеспечивает лучшую производительность по сравнению с Hashtable для типов значений. Это связано с тем, что элементы Hashtable типа Object, поэтому упаковка и распаковка обычно происходят при хранении или получении значимого типа. Класс ConcurrentDictionary<TKey,TValue> следует использовать, когда несколько потоков могут одновременно получать доступ к коллекции.

См. также