108 votes

NameValueCollection vs Dictionnaire<string,string>

Duplicata possible :
IDictionary<string, string> ou NameValueCollection

Y a-t-il une raison pour laquelle je devrais utiliser le 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 le Dictionnaire<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 plutôt que l'autre ? Y a-t-il une différence en termes de performances, d'utilisation de la mémoire, d'ordre de tri, etc.

136voto

Keltex Points 17151

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

Personnellement, si vous n'avez pas de double des clés, alors je m'en tiendrais à l'option Dictionary . Il est plus moderne, utilise IEnumerable<> ce qui permet de se mêler facilement aux Linq requêtes. Vous pouvez même créer un Dictionary en utilisant le Linq ToDictionary() método.

1 votes

Vous pouvez également utiliser .ToLookup(o => [key], o => [value(s)]) si vous avez des clés dupliquées, et il devrait ( ?) se comporter comme un dictionnaire en lecture seule.

7 votes

NameValueCollection hérite de NameObjectCollectionBase qui met en œuvre IEnumerable donc il est également énumérable et utilisable avec LINQ.

20voto

John K Points 13695

NameValueCollection est string tapé alors que Dictionary s'appuie sur les génériques pour permettre la variance de type. Voir Avantages des génériques .

1 votes

NameValueCollection est fortement typé. Elle utilise des chaînes de caractères partout. Pas de références d'objets du tout.

0 votes

Merci @LoneCoder, c'est réparé.

11voto

code4life Points 8797

Dictionary sera beaucoup plus rapide. NameValueCollection permet de dupliquer les clés. Ce qui pourrait être mauvais dans certaines situations, ou souhaité dans d'autres. Dictionary ne permet pas de dupliquer les clés.

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

El Dictionary<(Of <(TKey, TValue>)>) La classe générique fournit une correspondance entre un ensemble de clés à un ensemble de valeurs. Chaque addition au dictionnaire consiste en une 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) parce que le Dictionary<(Of <(TKey, TValue>)>) est implémentée comme une table de hachage.

0 votes

Mais pourquoi prétendez-vous que NameValueCollection est no impliqué comme une table de hachage ? Je vois beaucoup de gens le prétendre, mais je n'ai pas trouvé de documentation ou de références indiquant cela. Cependant, je reconnais que si une NameValueCollection a été créée, elle peut être utilisée comme une table de hachage. pour pour les QueryStrings, alors ils devraient no utiliser une table de hachage parce que la table de hachage serait plus lent pour la plupart des cas. Vous affirmez que le dictionnaire est plus rapide, mais ce n'est vrai que pour les grandes listes. Les petites listes, comme celles à 10 clés, sont normalement plus rapides sans table de hachage. Je vous demande donc d'être prudent avant de qualifier quoi que ce soit de " plus rapide " de manière générale ; cela dépend.

0 votes

@ShawnKovac : Ce n'est pas moi qui affirme que la CNV n'est pas implémentée comme une table de hachage. C'est une citation directe de MSDN. N'hésitez pas à vérifier mon texte copié-collé ! :)

1 votes

Où MSDN affirme-t-il que la NVC n'est pas implémentée comme une table de hachage ? Je ne trouve pas cela, et j'ai même trouvé le contraire, bien que ce ne soit pas directement indiqué. Mais MSDN montre que NameValueCollection est hérité de NameObjectCollectionBase et sur la page NameObjectCollectionBase, la première phrase sous Remarques est "La structure sous-jacente de cette classe est une table de hachage". msdn.microsoft.com/fr/us/library/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X