values new generic generics .net-3.5 collections dictionary stringdictionary

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