J'utilise Dictionary dans mon code mais mes collègues utilisent Hashtable. MSDN indique qu'ils travaillent sur la paire Valeur/Valeur et que les exemples de Hashtable et de dictionnaire sont identiques sur MSDN.
Dans quelle mesure sont-ils différents les uns des autres et quels sont les meilleurs d'entre eux ou conviennent-ils à des occasions différentes?
Hashtable
est un conteneur associatif non typé qui utilise la classe DictionaryEntry
pour renvoyer les résultats de l'énumération via ses paires clé-valeur.
Dictionary<K,T>
est un remplacement générique de Hashtable
introduit dans C # 2.0. Il utilise des objets génériques KeyValuePair<K,T>
pour représenter ses paires clé-valeur.
Le seul endroit où vous devriez voir Hashtable
ces jours-ci est le code hérité qui doit s'exécuter sur .NET 1.1, avant que les génériques aient été introduits. Il a été conservé pour des raisons de compatibilité, mais vous devriez préférer Dictionary<K,T>
chaque fois que vous le pouvez.
KeyValuePair
est l'unité de données stockée dans une Hashtable
(ou Dictionary
). Ils ne sont pas équivalents les uns aux autres.
Une paire clé/valeur contient une seule clé et une seule valeur. Un dictionnaire ou une table de hachage contient un mappage de nombreuses clés avec leurs valeurs associées.
KeyValuePair
est utile lorsque vous souhaitez stocker deux informations liées dans une seule unité, en particulier lorsqu'une est liée à l'autre de manière identifiable (par exemple 1234 => "David Smith"). C'est aussi ce que vous obtenez lorsque vous parcourez un dictionnaire. Dans .NET 4.0, ils ne sont réellement destinés qu’à être utilisés en interne dans un dictionnaire - la classe Tuple a été introduite pour un usage général.
La différence entre Hashtable
et Dictionary
est que Hashtable
n'est pas une classe générique. Ses clés et ses valeurs sont de type Object
. Dictionary
est générique et devrait généralement être utilisé en faveur de Hashtable
dans tout nouveau développement.
Un dictionnaire est une hashtable dactylographiée. Si vous connaissez le type de données de la clé et de la valeur, utilisez un dictionnaire pour des raisons de performances (évitez les conversions).
Une différence majeure est que Hashtable
est thread-safe, alors que Dictionary
ne l’est pas.
La documentation dit:
Hashtable
est thread-safe pour une utilisation avec plusieurs threads de lecteur et un seul thread d'écriture. Il est thread-safe pour une utilisation multi-thread quand un seul des threads effectue des opérations d'écriture (mise à jour), ce qui permet des lectures sans verrouillage, à condition que les rédacteurs soient sérialisés enHashtable
. Pour prendre en charge plusieurs auteurs, toutes les opérations surHashtable
doivent être effectuées via le wrapper renvoyé par la méthodeSynchronized
, à condition qu'aucun thread ne lise l'objet Hashtable.
Comparez cela avec la documentation Dictionary
:
Une
Dictionary(Of TKey, TValue)
peut prendre en charge plusieurs lecteurs simultanément, à condition que la collection ne soit pas modifiée.
KeyValuePair<TKey, TValue>
est un type utilisé par Dictionary<TKey, TValue>
. Lorsque vous parcourez les éléments d'un dictionnaire, vous obtenez une série d'objets KeyValuePair
.
Voici quelques exemples d'utilisation:
var dict = new Dictionary<string, int>();
dict.Add("Hello", 1);
foreach (KeyValuePair<string, int> entry in dict)
{
string s = entry.Key;
int i = entry.Value;
// More logic here
}