Каковы различия в хэш-таблице, словаре и KeyValuePair?
Я использую словарь в своем коде, но мои коллеги используют Hashtable. MSDN говорит, что они работают с парой Key Value &
примеры Hashtable и словаря одинаковы в MSDN.
Тогда насколько они отличаются друг от друга и какие из них лучше или подходят для разницы?
Ответы
Ответ 1
Hashtable
- нетипизированный ассоциативный контейнер, который использует класс DictionaryEntry
для возврата результатов перечисления через его пары ключ-значение.
Dictionary<K,T>
является общей заменой Hashtable
, которая была введена в С# 2.0. Он использует KeyValuePair<K,T>
общие объекты для представления своих пар ключ-значение.
Единственное место, где вы должны увидеть Hashtable
в эти дни, - это устаревший код, который должен выполняться на .NET 1.1, прежде чем будут представлены дженерики. Он поддерживался по соображениям совместимости, но вы должны предпочесть Dictionary<K,T>
, когда можете.
Ответ 2
KeyValuePair
- это единица данных, хранящихся в Hashtable
(или Dictionary
). Они не эквивалентны друг другу.
Пара ключевых значений содержит один ключ и одно значение. Словарь или хеш-таблица содержит сопоставление многих ключей с их соответствующими значениями.
KeyValuePair
полезен, когда вы хотите хранить две связанные части информации как единое целое, особенно когда одно связано с другим способом идентификации (например, 1234 = > "Дэвид Смит" ). Они также являются тем, что вы возвращаете, когда вы перебираете словарь. В .NET 4.0 они действительно предназначены только для использования внутри класса Dictionary- Tuple, который был введен для общего использования.
Разница между Hashtable
и Dictionary
заключается в том, что Hashtable
не является общим классом - оба ключа и значения имеют тип Object
. Dictionary
является общим и обычно должен использоваться в пользу Hashtable
в любой новой разработке.
Ответ 3
Словарь - это типизированная хэш-таблица. Если вы знаете тип данных ключа и значение, используйте словарь по причинам производительности (избегайте кастинга).
Ответ 4
Одно существенное отличие состоит в том, что Hashtable
является потокобезопасным, а Dictionary
- нет.
В документации говорится:
Hashtable
является потокобезопасным для использования несколькими потоками чтения и одним потоком записи. Он является потокобезопасным для многопоточного использования, когда только один из потоков выполняет операции записи (обновления), что позволяет читать без блокировки при условии, что сценаристы сериализуются в Hashtable
. Для поддержки нескольких авторов все операции над Hashtable
должны выполняться через оболочку, возвращаемую методом Synchronized
, при условии, что нет потоков, читающих объект Hashtable.
Сравните это с Dictionary
документацией:
A Dictionary(Of TKey, TValue)
может поддерживать несколько считывателей одновременно, пока коллекция не будет изменена.