c# - variable - IDictionary<string, string> o NameValueCollection
generic variable c# (4)
Estos tipos de colección no son exactamente intercambiables: NameValueCollection permite el acceso a través de índices enteros. Si no necesita esa funcionalidad, no debe usar NameValueCollection ya que la indexación no es "gratis".
Dependiendo de la cantidad de cadenas que estés viendo, consideraría Hashtable o IDictionary. Krzysztof Cwalina discute las sutilezas aquí: http://blogs.gotdotnet.com/kcwalina/archive/2004/08/06/210297.aspx .
Tengo un escenario en el que puedo usar NameValueCollection o IDictionary. Pero me gustaría saber cuál será mejor en cuanto a rendimiento.
- Usando NameValueCollection
NameValueCollection options()
{
NameValueCollection nc = new NameValueCollection();
nc = ....; //populate nc here
if(sorting)
//sort NameValueCollection nc here
return nc;
}
- utilizando 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;
}
Estoy de acuerdo con fatcat y lomaxx (y voté a favor de ambas respuestas). Me gustaría agregar que el rendimiento de los tipos de colección debería ser la última consideración al elegir entre los tipos de colección. Utilice el tipo que más se ajuste a sus necesidades de uso. Si se encuentra en una sección de código de rendimiento crítico (y lo más probable es que no lo esté), entonces la única respuesta es medir cada caso: no crea en Interweb, crea los números.
La otra ventaja de IDictionary es que no es una implementación específica a diferencia de NameValueCollection.
Una NameValueCollection en .NET es básicamente lo que se usa para que QueryStrings mantenga pares clave / valor. La mayor diferencia es cuando se agregan dos elementos con la misma clave. Con IDictionary, hay dos formas de establecer un valor. El uso del método .Add () generará un error en una clave duplicada cuando la clave ya exista. Pero simplemente establecer el elemento igual a un valor sobrescribirá el valor. Así es como IDictionary maneja las claves duplicadas. Pero NameValueCollection agregará valores como este: "value1, value2, value3". Por lo tanto, el valor del elemento existente se agrega con una coma, luego el nuevo valor se agrega cada vez.
Me parece que este NameValueCollection fue construido específicamente para el uso y acceso de QueryString. Un QueryString como "? A = 1 & b = 2 & a = 3" en .NET producirá un resultado del elemento ["a"] = "1,3". Esta diferencia de cómo se tratan las claves duplicadas es la diferencia "real", es decir, la mayor diferencia entre las dos.
Sospecho que una NameValueCollection tampoco usa ninguna tabla hash para acceder rápidamente a las claves cuando la colección es grande porque este acceso es más lento para colecciones pequeñas que sin la tabla hash. No he encontrado información definitiva que indique si una NameValueCollection utiliza o no una tabla hash para acceder a las claves. Sé que un IDictionary utiliza una tabla hash para que acceder a las claves en un IDictionary con muchas claves sea bastante rápido. Entonces sospecho que un NameValueCollection es más rápido para colecciones pequeñas que un IDictionary. Si mi conjetura es correcta, entonces wud significa que un shift de NameValueCollection de ninguna manera se usa para grandes colecciones ya que cuanto mayor sea, masivamente se ralentiza sin una tabla hash para acceder a las claves.
Para el número de claves en una cadena de consulta, este número suele ser muy pequeño, por lo que supongo que el NameValueCollection no utiliza hashes, para un mejor rendimiento. Pero si Microsoft diseñó cosas para el rendimiento y para lo que es mejor para sus usuarios, Windows sería tan diferente como lo es hoy. Así que no podemos asumir nada de lo que ''debería ser''.
Además, quiero aclarar una afirmación incorrecta por la respuesta más popular votada a esta pregunta. El comentario de Kateroh debajo de la respuesta incorrecta lo dice bien enuf, que no necesito agregarle nada. Pero repito el comentario de Kateroh aquí, así que quizás más personas se den cuenta de que la respuesta más popular es incorrecta . Kateroh declara correctamente:
- De acuerdo con este artículo de msdn sobre NameValueCollection: https://msdn.microsoft.com/en-us/library/system.collections.specialized.namevaluecollection.aspx "Las colecciones de este tipo no conservan el orden del elemento ni ningún orden en particular Se garantiza al enumerar la colección ". - Kateroh Mar 4 ''11 a las 18:38