2009-03-09 33 views
64

¿Alguien tiene alguna idea de lo que son las diferencias prácticas entre el objeto y System.Collections.Specialized.StringDictionary System.Collections.Generic.Dictionary?StringDictionary vs Dictionary <string, string>

Los he usado tanto en el pasado sin mucho pensamiento en cuanto a lo que obtienen mejores resultados, trabajar mejor con LINQ, o proporcionar otros beneficios.

cualquier idea o sugerencia en cuanto a por qué debería utilizar uno sobre el otro?

Respuesta

77

Dictionary<string, string> es un enfoque más moderno. Implementa IEnumerable<T> y es más adecuado para cosas LINQy.

StringDictionary es la vieja escuela. Estaba allí antes de los días genéricos. Lo usaría solo cuando interactúe con el código heredado.

+2

¿Hay alguna diferencia de rendimiento entre los dos? – thecoop

+0

Debe comparar para ver cuál funciona mejor para su situación especial. No espero una diferencia de rendimiento notable. Recomiendo usar 'Dictionary ' para todos los códigos nuevos (a menos que necesites apuntar a 1.1). –

+1

@thecoop no hay datos duros para presentar desde mi lado ahora, pero una vez que hice la prueba de velocidad 'StringDictionary' funcionó peor (aunque todo eso no importará principalmente). Para ser sincero, antes tenía la idea de que 'StringDictionary' era una colección especializada para acelerar cuando' string' era la clave, y para mi gran sorpresa cuando funcionaba peor en mis pruebas, busqué en Google solo aprender que no es genérico – nawfal

33

Creo que StringDictionary es bastante obsoleto. Existía en la v1.1 del marco (antes de los genéricos), por lo que era una versión superior en ese momento (en comparación con el diccionario no genérico), pero en este punto, no creo que haya ventajas específicas en ello sobre Diccionario.

Sin embargo, hay desventajas para StringDictionary. StringDictionary reduce los valores clave de forma automática, y no hay opciones para controlar esto.

Ver:

http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/59f38f98-6e53-431c-a6df-b2502c60e1e9/

+0

'StringDictionary' se puede usar en' Properites.Settings' mientras 'Dictionary ' no. Tan obsoleto o no, todavía hay algo de uso para 'StringDictionary'. – jahu

36

Otro punto.

Esto devuelve nulo:

StringDictionary dic = new StringDictionary(); 
return dic["Hey"]; 

Esto arroja una excepción:

Dictionary<string, string> dic = new Dictionary<string, string>(); 
return dic["Hey"]; 
+0

La característica "throws a exception" * * de 'Dictionary <> 'significa que nunca puedo usar' [] '. Usar StringDictionary ha limpiado gran parte de mi código. –

+0

@James Llego un poco tarde, pero probablemente deba usar TryGetValue. –

+0

@ ŞafakGür - I * do * uso TryGetValue() - porque nunca puedo usar '[]' porque arroja una excepción. (StringDictionary solo resuelve esto para un tipo de Diccionarios) –

1

Además de ser una clase más "moderno", me di cuenta de que Dictionary es más eficiente de la memoria de StringDictionary por un amplio margen .

+8

podríamos usar algunos números aquí – Zonko

29

Como Reed Copsey, señaló StringDictionary menores-casos sus valores clave. Para mí, esto fue totalmente inesperado, y es un impedimento para el espectáculo.

private void testStringDictionary() 
{ 
    try 
    { 
     StringDictionary sd = new StringDictionary(); 
     sd.Add("Bob", "My name is Bob"); 
     sd.Add("joe", "My name is joe"); 
     sd.Add("bob", "My name is bob"); // << throws an exception because 
             // "bob" is already a key! 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

estoy añadiendo esta respuesta a llamar más la atención sobre este enorme diferencia, que la OMI es más importante que la moderna frente a la diferencia de la vieja escuela.

+2

Si por alguna razón uno quiere el mismo comportamiento con Dictionary esto puede usarse: Dictionary ht = new Dictionary (StringComparer.OrdinalIgnoreCase); ht.Add ("Bob", "ff"); ht.Add ("bob", "ff"); // arroja una excepción – osexpert

2

StringDictionary proviene de .NET 1.1 e implementa IEnumerable

Dictionary<string, string> proviene de .NET 2.0 e implementa IDictionary<TKey, TValue>,IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable

IgnoreCase sólo se establece para Key en StringDictionary

Dictionary<string, string> es bueno para LINQ

 Dictionary<string, string> dictionary = new Dictionary<string, string>(); 
     dictionary.Add("ITEM-1", "VALUE-1"); 
     var item1 = dictionary["item-1"];  // throws KeyNotFoundException 
     var itemEmpty = dictionary["item-9"]; // throws KeyNotFoundException 

     StringDictionary stringDictionary = new StringDictionary(); 
     stringDictionary.Add("ITEM-1", "VALUE-1"); 
     var item1String = stringDictionary["item-1"];  //return "VALUE-1" 
     var itemEmptystring = stringDictionary["item-9"]; //return null 

     bool isKey = stringDictionary.ContainsValue("VALUE-1"); //return true 
     bool isValue = stringDictionary.ContainsValue("value-1"); //return false 
1

Otro poi relevante nt es eso (corríjame si me equivoco aquí) System.Collections.Generic.Dictionary no se puede utilizar en la configuración de la aplicación (Properties.Settings) mientras que System.Collections.Specialized.StringDictionary es.

Cuestiones relacionadas