NameValueCollection vs Dictionary <string, string>

Возможный дубликат:
IDictionary < string, string > или NameValueCollection

Любая причина, по которой я должен использовать Dictionary < string, string > вместо NameValueCollection?

(в С#/.NET Framework)

Вариант 1, используя NameValueCollection:

//enter values:
NameValueCollection nvc = new NameValueCollection()
{
  {"key1", "value1"},
  {"key2", "value2"},
  {"key3", "value3"}
};

// retrieve values:
foreach(string key in nvc.AllKeys)
{
  string value = nvc[key];
  // do something
}

Вариант 2, используя словарь < string, string > ...

//enter values:
Dictionary<string, string> dict = new Dictionary<string, string>()
{
  {"key1", "value1"},
  {"key2", "value2"},
  {"key3", "value3"}
};

// retrieve values:
foreach (KeyValuePair<string, string> kvp in dict)
{
  string key = kvp.Key;
  string val = kvp.Value;
  // do something
}

Для этих случаев использования существует ли какое-либо преимущество для использования одного и другого? Любая разница в производительности, использовании памяти, порядке сортировки и т.д.?

Ответ 1

Они не семантически идентичны. NameValueCollection может иметь дубликаты ключей, а Dictionary не может.

Лично, если у вас нет дубликатов ключей, я бы придерживался Dictionary. Он более современный, использует IEnumerable<>, что позволяет легко смешиваться с запросами Linq. Вы даже можете создать Dictionary с помощью метода Linq ToDictionary().

Ответ 2

NameValueCollection - это строка, напечатанная, тогда как словарь использует обобщения для разрешения дисперсии типа. См. Преимущества дженериков.

Ответ 3

Словарь будет намного быстрее. NameValueCollection позволяет дублировать ключи. Что может быть плохо в определенных ситуациях или же желательно в другом. Словарь не позволяет дублировать ключи.

От: http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

Словарь < (Of < (TKey, TValue > ) > ) общий класс обеспечивает отображение из набор ключей к набору значений. каждый дополнение к словарю состоит из значение и связанный с ним ключ. Получение значения с помощью его ключа очень быстро, близко к O (1), поскольку Словарь < (Of < (TKey, TValue > ) > ) класс реализуется как хеш-таблица.