Quelqu'un a-t-il une idée des différences pratiques entre l'objet System.Collections.Specialized.StringDictionary et System.Collections.Generic.Dictionary?
Je les ai utilisés tous les deux dans le passé sans trop réfléchir à ce qui fonctionnerait mieux, fonctionnerait mieux avec Linq ou offrirait d'autres avantages.
Avez-vous des idées ou des suggestions sur la raison pour laquelle je devrais utiliser l'une plutôt que l'autre?
Dictionary<string, string>
est une approche plus moderne. Il implémente IEnumerable<T>
et il est plus adapté pour les choses LINQy.
StringDictionary
est la méthode à l'ancienne. C'était avant les jours génériques. Je ne l'utiliserais que lors de l'interfaçage avec du code hérité.
Un autre point.
Cela renvoie null:
StringDictionary dic = new StringDictionary();
return dic["Hey"];
Cela lève 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 la version 1.1 du framework (avant les génériques), il s'agissait donc d'une version supérieure à l'époque (par rapport au dictionnaire non générique), mais à ce stade, je ne pense pas qu'il y ait d'avantages spécifiques. sur Dictionnaire.
Cependant, StringDictionary présente des inconvénients. StringDictionary met en minuscule automatiquement vos valeurs de clé, et il n'y a pas d'options pour contrôler cela.
Voir:
http://social.msdn.Microsoft.com/forums/en-US/netfxbcl/thread/59f38f98-6e53-431c-a6df-b2502c60e1e9/
Comme l'a souligné Reed Copsey, StringDictionary met en minuscules vos valeurs clés. Pour moi, cela était totalement inattendu, et c'est un show-stopper.
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 davantage l'attention sur cette énorme différence, laquelle IMO est plus importante que la différence moderne vs old-school.
StringDictionary
provient de .NET 1.1 et implémente IEnumerable
Dictionary<string, string>
provient de .NET 2.0 et implémente IDictionary<TKey, TValue>,IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable
IgnoreCase est uniquement défini pour la clé dans 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
Un autre point pertinent est que (corrigez-moi si je me trompe ici) System.Collections.Generic.Dictionary
ne peut pas être utilisé dans les paramètres de l'application (Properties.Settings
) tandis que System.Collections.Specialized.StringDictionary
est.
En plus d'être une classe plus "moderne", j'ai remarqué que Dictionary est plus efficace en mémoire que StringDictionary par une grande marge.