web-dev-qa-db-fra.com

NameValueCollection vs Dictionary <chaîne, chaîne>

Duplicate possible:
IDictionary <string, string> ou NameValueCollection

Pour quelle raison dois-je utiliser Dictionary <string, string> au lieu de NameValueCollection?

(en C #/.NET Framework)

Option 1, en utilisant 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
}

Option 2, en utilisant Dictionary <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
}

Pour ces cas d'utilisation, y a-t-il un avantage à utiliser l'un ou l'autre? Des différences de performances, d’utilisation de la mémoire, d’ordre de tri, etc.?

92
frankadelic

Ils ne sont pas sémantiquement identiques. Le NameValueCollection peut avoir des clés dupliquées alors que le Dictionary ne le peut pas.

Personnellement, si vous n'avez pas de clés dupliquées, je resterais avec le Dictionary. C'est plus moderne, utilise IEnumerable<>, Ce qui permet de se mêler facilement aux requêtes Linq. Vous pouvez même créer un Dictionary en utilisant la méthode LinqToDictionary().

120
Keltex

NameValueCollection est une chaîne de caractères, alors que Dictionary utilise des génériques pour permettre la variance de types. Voir Avantages des génériques .

16
John K

Dictionnaire sera beaucoup plus rapide. NameValueCollection autorise les clés en double. Ce qui pourrait être mauvais dans certaines situations ou souhaité dans d'autres. Le dictionnaire n'autorise pas les clés en double.

De: http://msdn.Microsoft.com/en-us/library/xfhwa508.aspx

La classe générique Dictionary <(Of <(TKey, TValue>)>) fournit un mappage d'un ensemble de clés à un ensemble de valeurs. Chaque ajout au dictionnaire consiste en une valeur et sa clé associée. La récupération d'une valeur à l'aide de sa clé est très rapide, proche de O (1), car la classe Dictionary <(Of <(TKey, TValue>)>) est implémentée sous la forme d'une table de hachage.

10
code4life