IDictionary<string, string> ou NameValueCollection
J'ai un scénario où-je peux utiliser NameValueCollection ou IDictionary. Mais je voudrais savoir à qui l'on sera mieux en terme de performance.
-- À L'Aide De NameValueCollection
NameValueCollection options()
{
NameValueCollection nc = new NameValueCollection();
nc = ....; //populate nc here
if(sorting)
//sort NameValueCollection nc here
return nc;
}
-- à l'aide de IDictionary
IDictionary<string, string> options()
{
Dictionary<string, string> optionDictionary = new Dictionary<string, string>();
optionDictionary = ....; //populate
if(sorting)
return new SortedDictionary<string, string>(optionDictionary);
else
return optionDictionary;
}
Vous devez vous connecter pour publier un commentaire.
Ces types de collection ne sont pas exactement interchangeables: NameValueCollection permet un accès par index entiers. Si vous n'avez pas besoin de cette fonctionnalité, vous ne devriez pas utiliser un NameValueCollection que l'indexation ne vient pas "gratuit".
Selon le nombre de chaînes que vous êtes en train de regarder, je voudrais tenir compte d'une table de hachage ou IDictionary. Krzysztof Cwalina explique les subtilités ici: http://blogs.gotdotnet.com/kcwalina/archive/2004/08/06/210297.aspx.
L'autre avantage de IDictionary est qu'elle n'est pas mise en œuvre spécifiques à la différence de NameValueCollection.
NameValueCollection
est un type concret.IDictionary
est une interface. Donc, avec l'interface vous avez plus de souplesse que vous pouvez utiliser un béton de classe qui implémente cette interface.Je suis d'accord avec fatcat et lomaxx (et ont voté pour les deux réponses). Je voudrais ajouter que la performance des types de collection doivent probablement être la dernière considération au moment de choisir entre les types de collection. Utiliser le type qui se rapproche le plus de vos besoins d'utilisation. Si vous êtes dans une critique pour les performances de la section de code (et très probablement, vous n'êtes pas), alors la seule solution est de mesurer chaque cas ne crois pas que l'Interweb, croient que les nombres.
Une NameValueCollection dans .NET est essentiellement ce qui est utilisé pour QueryStrings de tenir des paires clé/valeur. La plus grande différence, c'est quand deux éléments avec la même clé sont ajoutés. Avec IDictionary, il y a deux façons de définir une valeur. À l'aide de l' .Méthode Add() renvoie une erreur sur un double de la clé lorsque la clé existe déjà. Mais simplement le réglage de l'élément égal à une valeur de remplacer la valeur. C'est de cette façon IDictionary poignées doubles de clés. Mais NameValueCollection va ajouter des valeurs comme ceci: "valeur1,valeur2,valeur3". Donc, l'élément existant de la valeur est ajoutée par une virgule, puis la nouvelle valeur ajoutée à chaque fois.
Il me semble que ce NameValueCollection a été construit spécifiquement pour QueryString utilisation et d'accès. Une QueryString "comme?a=1&b=2&a=3".NET obtenir un résultat de la rubrique["a"] = "1,3". Cette différence de comment dupliquer des clés sont traités est la "vraie" différence, c'est la plus grande différence entre les deux.
Je suspect qu'un NameValueCollection également de ne pas utiliser une table de hachage pour un accès rapide des touches lorsque la collection est importante parce que cet accès est plus lent pour les petites collections que sans la table de hachage. Je n'ai pas trouvé d'information précise qui indique si une NameValueCollection ou ne pas utiliser une table de hachage de l'accès aux clés. Je ne savoir qu'un IDictionary utilise une table de hachage de sorte que l'accès à des clés dans un IDictionary avec le nombre de touches est assez rapide. J'ai donc suspect qu'un NameValueCollection est plus rapide pour les petites collections que l'un IDictionary. Si ma supposition est correcte, alors il wud dire une NameValueCollection shud en aucun cas être utilisés pour les grandes collections depuis le plus il est grand, massivement ralentit sans une table de hachage de l'accès aux clés.
Pour le nombre de clés dans une chaîne de requête, ce nombre est normalement très faible, donc je wud deviner le NameValueCollection ne pas utilisation de tables de hachage, pour de meilleures performances. Mais si Microsoft a conçu les choses pour la performance, et pour ce qui est le mieux pour leurs utilisateurs, Windows duh être donc différente de ce qu'elle est aujourd'hui. On ne peut donc pas supposer quoi que ce soit que "shud être".
Aussi, je tiens à préciser une mauvaise créance par les plus couramment voté réponse à cette question. Kateroh de commentaire ci-dessous une mauvaise réponse, le dit bien enuf, que je n'ai pas besoin d'ajouter quoi que ce soit. Mais je le répète, Kateroh commentaire ici, donc peut-être plus de gens vont réaliser que la réponse la plus populaire est mal. Kateroh correctement états: