generics - new - search in dictionary c#
StringDictionary vs Dictionary<string, string> (7)
¿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 de ellos 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?
Además de ser una clase más "moderna", noté que el diccionario es más eficiente en memoria que StringDictionary por un amplio margen.
Como señaló Reed Copsey, StringDictionary reduce los 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 agregando esta respuesta para llamar más la atención sobre esta enorme diferencia, que IMO es más importante que la diferencia entre la escuela moderna y la de la vieja escuela.
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/
Otro punto relevante es que (corríjame si me equivoco aquí) System.Collections.Generic.Dictionary
no se puede usar en la configuración de la aplicación ( Properties.Settings
) mientras que System.Collections.Specialized.StringDictionary
está.
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"];
Dictionary<string, string>
es un enfoque más moderno. Implementa IEnumerable<T>
y es más adecuado para cosas LINQy.
StringDictionary
es la forma de la vieja escuela. Estaba allí antes de los días genéricos. Lo usaría solo cuando interactúe con el código heredado.
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 solo está configurado para Key in 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