web-dev-qa-db-fra.com

Quelles sont les différences entre Hashtable, Dictionary et KeyValuePair?

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?

24
Nikhil Agrawal

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.

24
dasblinkenlight

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.

17
Chris Shain

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).

5
hp.

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 en Hashtable. Pour prendre en charge plusieurs auteurs, toutes les opérations sur Hashtable doivent être effectuées via le wrapper renvoyé par la méthode Synchronized, à 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.

0
Gabe

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
}
0
Yogesh Patel