¿Hay una manera rápida y simple de verificar si existe una clave en una NameValueCollection sin recorrerla?
Buscando algo como Dictionary.ContainsKey () o similar.
Hay muchas formas de resolver esto, por supuesto. Solo me pregunto si alguien puede ayudar a rascarme la picazón del cerebro.
c#
.net
namevaluecollection
Muhammad Yussuf
fuente
fuente
Respuestas:
De MSDN :
Entonces puedes simplemente:
collection[key]
llama abase.Get()
continuación,base.FindEntry()
que utiliza internamenteHashtable
con el rendimiento O (1).fuente
0
igualnull
... sryUsa este método:
Es el más eficiente
NameValueCollection
y no depende de si la colección contienenull
valores o no.fuente
using System.Linq;
cuando use esta solución.No creo que ninguna de estas respuestas sea correcta / óptima. NameValueCollection no solo no distingue entre valores nulos y valores perdidos, sino que también distingue entre mayúsculas y minúsculas con respecto a sus claves. Por lo tanto, creo que una solución completa sería:
fuente
Sí, puede usar Linq para verificar la
AllKeys
propiedad:Sin embargo, a
Dictionary<string, string[]>
sería mucho más adecuado para este propósito, tal vez creado mediante un método de extensión:fuente
collection[key]
usa internamenteHashtable
cuál es O (1)collection[key]
hace distinción entre la clave que no está presente y un valor nulo almacenado en esa clave.Puede usar el
Get
método y verificarlo,null
ya que el método devolveránull
si NameValueCollection no contiene la clave especificada.Ver MSDN .
fuente
index
de lakey
que llamar al método. Tu no?Si el tamaño de la colección es pequeño, puede optar por la solución proporcionada por rich.okelly. Sin embargo, una gran colección significa que la generación del diccionario puede ser notablemente más lenta que solo buscar en la colección de claves.
Además, si su escenario de uso está buscando claves en diferentes puntos en el tiempo, donde NameValueCollection puede haber sido modificado, generar el diccionario cada vez puede, una vez más, ser más lento que simplemente buscar en la colección de claves.
fuente
Esto también podría ser una solución sin tener que introducir un nuevo método:
fuente
Como puede ver en las fuentes de referencia, NameValueCollection hereda de NameObjectCollectionBase .
Entonces, toma el tipo base, obtiene la tabla hash privada a través de la reflexión y verifica si contiene una clave específica.
Para que funcione también en Mono, debe ver cuál es el nombre de la tabla hash en mono, que es algo que puede ver aquí (m_ItemsContainer), y obtener el campo mono, si FieldInfo inicial es nulo (mono- tiempo de ejecución).
Me gusta esto
para el código .NET 2.0 ultrapuro no reflectante, puede recorrer las teclas, en lugar de usar la tabla hash, pero eso es lento.
fuente
En VB es:
En C # solo debería ser:
No estoy seguro de si debería ser
null
o debería ser""
útil.fuente
Dictionary
estructura de datos, como enMyNameValueCollection[Key]
, en lugar deMyNameValueCollection(Key)
, que espera una llamada al método.Estoy usando esta colección, cuando trabajé en la colección de elementos pequeños.
Cuando los elementos son muchos, creo que necesito usar "Diccionario". Mi código:
O se puede usar esto:
fuente
Tenga en cuenta que la clave puede no ser única y que la comparación suele ser sensible a mayúsculas y minúsculas. Si desea obtener el valor de la primera clave coincidente y no se preocupa por el caso, use esto:
fuente
Tipo de valor de retorno: System.Boolean verdadero si NameValueCollection contiene claves que no son nulas; de lo contrario, falso. ENLACE
fuente