2009-05-25 2 views
96

В чем разница между KeyValuePair, которая является общей версией и DictionaryEntry?KeyValuePair VS DictionaryEntry

Почему KeyValuePair используется вместо DictionaryEntry в классе общего словаря?

ответ

42

KeyValuePair < T, T> для итерации через словарь < T, T>. Это - .Net 2 (и далее) способ делать вещи.

DictionaryEntry предназначен для итерации через хэш-таблицы. Это способ .Net 1 делать вещи.

Вот пример:

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 - это дженерики, другие - предипики. Рекомендуется использовать первый вариант fwd. – Gishu

+1

Я думаю, он понимает, что он предназначен для дженериков, а другой для не-дженериков. Я думаю, что его вопрос заключается в том, почему нам нужны оба? – cdmckay

+1

Если это то, о чем он спрашивает, нам действительно не нужны оба - это просто, что дженерики недоступны до .net 2, и они оставили материал без дженериков для обратной совместимости. Некоторым людям по-прежнему нравится использовать не-общий материал, но его не рекомендуется. – Chris

90

KeyValuePair<TKey,TValue> используется вместо DictionaryEntry, потому что он обобщен. Преимущество использования KeyValuePair<TKey,TValue> заключается в том, что мы можем предоставить компилятору больше информации о том, что есть в нашем словаре. Чтобы расширить пример Криса (в котором у нас есть два словаря, содержащих <string, int> пар).

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 для "generified". Это вообще слово? :-p – BFree

+3

Наверняка это обобщено? – danielcooperxyz

+14

наверняка это обобщенное (limeyfied) или обобщенное (yankeefied) –

Смежные вопросы