¿Alguien tiene alguna idea de cuáles son las diferencias prácticas entre el objeto System.Collections.Specialized.StringDictionary y System.Collections.Generic.Dictionary?
Los he usado en el pasado sin pensar mucho en cuál funcionaría mejor, funcionaría mejor con Linq o proporcionaría otros beneficios.
¿Alguna idea o sugerencia sobre por qué debería usar una sobre la otra?
generics
.net-3.5
collections
dictionary
stringdictionary
Scott Ivey
fuente
fuente
Dictionary<string,string>
para todo el código nuevo (a menos que necesite apuntar a 1.1).StringDictionary
funcionó peor (aunque todo eso no importará principalmente). Para ser honesto, de hecho, antes tenía la noción de queStringDictionary
era una especie de colección especializada destinada a acelerar las cosas cuandostring
era la clave, y para mi gran sorpresa cuando funcionó peor en mis pruebas, busqué en Google solo para descubrir que no es genéricoOtro 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"];
fuente
Dictionary<>
los medios que nunca pueda usar[]
. Use StringDictionary ha limpiado gran parte de mi código.[ ]
ya que se produce una excepción. (StringDictionary solo resuelve esto para un tipo de diccionarios)Como señaló Reed Copsey, StringDictionary reduce en minúsculas sus valores clave. Para mí, esto fue totalmente inesperado y es un obstá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 agregando esta respuesta para llamar más la atención sobre esta gran diferencia, que en mi opinión es más importante que la diferencia moderna frente a la vieja escuela.
fuente
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 tenga ventajas específicas. sobre Diccionario.
Sin embargo, StringDictionary tiene desventajas. StringDictionary reduce en minúsculas sus valores clave automáticamente, y no hay opciones para controlar esto.
Ver:
http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/59f38f98-6e53-431c-a6df-b2502c60e1e9/
fuente
StringDictionary
se puede utilizarProperites.Settings
mientrasDictionary<string,string>
que no. Tan obsoleto o no, todavía tiene algún usoStringDictionary
.StringDictionary
proviene de .NET 1.1 e implementaIEnumerable
Dictionary<string, string>
proviene de .NET 2.0 e implementaIDictionary<TKey, TValue>,IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable
IgnoreCase solo está configurado para Key in
StringDictionary
Dictionary<string, string>
es bueno para LINQDictionary<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
fuente
Además de ser una clase más "moderna", noté que Dictionary es más eficiente en memoria que StringDictionary por un amplio margen.
fuente
Otro punto relevante es que (corrígeme si me equivoco aquí)
System.Collections.Generic.Dictionary
no se puede usar en la configuración de la aplicación (Properties.Settings
) mientrasSystem.Collections.Specialized.StringDictionary
que sí.fuente