2009-05-25 5 views
96

Quelle est la différence entre KeyValuePair qui est la version générique et DictionaryEntry?KeyValuePair VS DictionaryEntry

Pourquoi KeyValuePair est utilisé à la place de DictionaryEntry dans la classe Dictionary?

Répondre

42

KeyValuePair < T, T> est pour itération à travers le Dictionnaire < T, T>. C'est la façon de faire les choses .Net 2 (et suivantes). DictionaryEntry est pour l'itération à travers HashTables.

C'est la façon .Net 1 de faire les choses.

Voici un exemple:

Dictionary<string, int> MyDictionary = new Dictionary<string, int>(); 
foreach (KeyValuePair<string, int> item in MyDictionary) 
{ 
    // ... 
} 

Hashtable MyHashtable = new Hashtable(); 
foreach (DictionaryEntry item in MyHashtable) 
{ 
    // ... 
} 
+4

KeyValuePair est Generics, l'autre est des pré-génériques. L'utilisation de l'ancien est recommandé en passant fwd. – Gishu

+1

Je pense qu'il comprend que l'un est pour les génériques, et l'autre pour les non-génériques. Je pense que sa question est pourquoi avons-nous besoin des deux? – cdmckay

+1

Si c'est ce qu'il demande, eh bien, nous n'avons pas vraiment besoin des deux - c'est juste que les génériques n'étaient pas disponibles avant .net 2, et ils ont laissé les choses non-génériques pour la compatibilité ascendante. Certaines personnes peuvent toujours vouloir utiliser des choses non génériques, mais ce n'est pas vraiment recommandé. – Chris

90

KeyValuePair<TKey,TValue> est utilisé à la place de DictionaryEntry parce qu'il est generified. L'avantage d'utiliser un KeyValuePair<TKey,TValue> est que nous pouvons donner plus d'informations au compilateur sur ce qui est dans notre dictionnaire. Pour développer l'exemple de Chris (dans lequel nous avons deux dictionnaires contenant <string, int> paires).

Dictionary<string, int> dict = new Dictionary<string, int>(); 
foreach (KeyValuePair<string, int> item in dict) { 
    int i = item.Value; 
} 

Hashtable hashtable = new Hashtable(); 
foreach (DictionaryEntry item in hashtable) { 
    // Cast required because compiler doesn't know it's a <string, int> pair. 
    int i = (int) item.Value; 
} 
+66

+1 pour "Généré". Est-ce que c'est un mot? :-p – BFree

+3

Sûrement c'est généralisé? – danielcooperxyz

+14

sûrement il est générique (limeyfied), ou générique (yankeefied) –

Questions connexes