Existe-t-il un moyen rapide et simple de vérifier si une clé existe dans un NameValueCollection sans la parcourir en boucle?
Vous recherchez quelque chose comme Dictionary.ContainsKey () ou similaire.
Il existe bien sûr de nombreuses façons de résoudre ce problème. Je me demandais juste si quelqu'un pouvait m'aider à me gratter le cerveau.
c#
.net
namevaluecollection
Muhammad Yussuf
la source
la source
Réponses:
Depuis MSDN :
Vous pouvez donc simplement:
collection[key]
appellebase.Get()
alorsbase.FindEntry()
qui utilise en interneHashtable
avec la performance O (1).la source
0
égalnull
... sryUtilisez cette méthode:
C'est le plus efficace pour
NameValueCollection
et ne dépend pas de si la collection contient desnull
valeurs ou non.la source
using System.Linq;
lorsque vous utilisez cette solution.Je ne pense pas qu'aucune de ces réponses soit tout à fait correcte / optimale. NameValueCollection ne fait pas seulement la distinction entre les valeurs nulles et les valeurs manquantes, il est également insensible à la casse en ce qui concerne ses clés. Ainsi, je pense qu'une solution complète serait:
la source
Oui, vous pouvez utiliser Linq pour vérifier la
AllKeys
propriété:Cependant, un
Dictionary<string, string[]>
serait beaucoup plus adapté à cet objectif, peut-être créé via une méthode d'extension:la source
collection[key]
utilise en interneHashtable
ce qui est O (1)collection[key]
fait aucune distinction entre la clé non présente et une valeur nulle stockée contre cette clé.Vous pouvez utiliser la
Get
méthode et vérifiernull
que la méthode retourneranull
si NameValueCollection ne contient pas la clé spécifiée.Voir MSDN .
la source
index
lekey
pour appeler la méthode. Pas toi?Si la taille de la collection est petite, vous pouvez utiliser la solution fournie par rich.okelly. Cependant, une grande collection signifie que la génération du dictionnaire peut être sensiblement plus lente que la simple recherche de la collection de clés.
En outre, si votre scénario d'utilisation recherche des clés à différents moments dans le temps, où NameValueCollection a peut-être été modifié, la génération du dictionnaire à chaque fois peut, encore une fois, être plus lente que la simple recherche de la collection de clés.
la source
Cela pourrait également être une solution sans avoir à introduire une nouvelle méthode:
la source
Comme vous pouvez le voir dans les sources de référence, NameValueCollection hérite de NameObjectCollectionBase .
Vous prenez donc le type de base, obtenez la table de hachage privée par réflexion et vérifiez si elle contient une clé spécifique.
Pour que cela fonctionne également en Mono, vous devez voir quel est le nom de la table de hachage en mono, ce que vous pouvez voir ici (m_ItemsContainer), et obtenir le champ mono, si le FieldInfo initial est nul (mono- Durée).
Comme ça
pour le code .NET 2.0 ultra-pur non réfléchissant, vous pouvez boucler sur les clés, au lieu d'utiliser la table de hachage, mais c'est lent.
la source
En VB c'est:
En C # devrait juste être:
Je ne sais pas si cela devrait être
null
ou""
mais cela devrait aider.la source
Dictionary
structure de données, comme dansMyNameValueCollection[Key]
, plutôt queMyNameValueCollection(Key)
, qui attend un appel de méthode.J'utilise cette collection, quand j'ai travaillé dans la collection de petits éléments.
Là où les éléments sont nombreux, je pense qu'il faut utiliser "Dictionary". Mon code:
Ou peut être utiliser ceci:
la source
Sachez que la clé peut ne pas être unique et que la comparaison est généralement sensible à la casse. Si vous voulez simplement obtenir la valeur de la première clé correspondante et ne pas vous soucier de la casse, utilisez ceci:
la source
Type de valeur de retour: System.Boolean true si NameValueCollection contient des clés qui ne sont pas nulles; sinon, faux.LIEN
la source