StringDictionary vs Dictionary
est-ce que quelqu'un a une idée des différences pratiques entre le système?Collection.Spécialiser.StringDictionary de l'objet et du Système.Collection.Générique.Dictionnaire?
je les ai utilisés tous les deux dans le passé sans beaucoup de réflexion quant à ce qui fonctionnerait mieux, fonctionnerait mieux avec Linq, ou fournirait d'autres avantages.
des idées ou des suggestions sur la raison pour laquelle je devrais utiliser l'un par rapport à l'autre?
7 réponses
Dictionary<string, string>
est une approche plus moderne. Il met en œuvre IEnumerable<T>
et il est plus adapté pour les choses LINQy.
StringDictionary
est la vieille école. C'était là avant les journées génériques. Je l'utiliserais seulement quand j'interfacerais avec du code d'héritage.
autre point.
renvoie null:
StringDictionary dic = new StringDictionary();
return dic["Hey"];
cela jette une exception:
Dictionary<string, string> dic = new Dictionary<string, string>();
return dic["Hey"];
je pense que StringDictionary est à peu près obsolète. Il existait dans v1.1 dans le cadre (avant le générique), c'était donc une version supérieure à la fois (par rapport à la non-Dictionnaire générique), mais à ce point, je ne crois pas qu'il existe des avantages spécifiques au fil du Dictionnaire.
Cependant, il ya des inconvénients à StringDictionary. StringDictionary inferior-cases vos valeurs clés automatiquement, et il n'y a aucune option pour contrôler cela.
voir:
http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/59f38f98-6e53-431c-a6df-b2502c60e1e9 /
comme Reed Copsey l'a souligné, StringDictionary lower-cases vos valeurs clés. Pour moi, c'était totatlly inattendu, et est un show-bouchon.
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);
}
}
j'ajoute cette réponse pour attirer plus d'attention sur cette différence énorme , qui IMO est plus importante que la différence moderne vs. old-school.
StringDictionary
provient de .NET 1.1 et met en œuvre IEnumerable
Dictionary<string, string>
provient de .NET 2.0 et met en œuvre IDictionary<TKey, TValue>,IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable
IgnoreCase est seulement pour la Clé StringDictionary
Dictionary<string, string>
est bon pour 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
en plus d'être une classe plus" moderne", J'ai remarqué que le dictionnaire est plus efficace de mémoire que StringDictionary par une large marge.
un autre point important est que (corrigez-moi si je me trompe ici) System.Collections.Generic.Dictionary
ne peut pas être utilisé dans les paramètres d'application ( Properties.Settings
) alors que System.Collections.Specialized.StringDictionary
l'est.