KeyValuePair VS DictionaryEntry


117

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

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

Ответы:


108

KeyValuePair<TKey,TValue>используется вместо, DictionaryEntryпотому что он обобщен. Преимущество использования a в 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;
}

4
Неужто это обобщенное?
— danielcooperxyz

26
конечно, это обобщенное (известное) или обобщенное (янкифицированное)
— jenson-button-event

7
Слово, которое вы ищете, является обобщенным . ;)
— Джейсон

5
«обобщенный» как в более общем виде, а не в общем
— TheGeekZn

2
Я единственный, кто сказал бы "общий"?
— Mauro Sampietro

52

KeyValuePair <T, T> предназначен для перебора словаря <T, T>. Это способ работы .Net 2 (и более поздних версий).

DictionaryEntry предназначен для перебора HashTables. Это способ работы .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 - это Generics, другой - pre-generics. Использование первого рекомендуется для перехода вперед.
— Гишу

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

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

Этот ответ казался мне более понятным.
— Мерин Накарми
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.