web-dev-qa-db-fra.com

StringDictionary vs Dictionary <chaîne, chaîne>

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?

74
Scott Ivey

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é.

88
Mehrdad Afshari

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"];
40
joshcomley

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/

36
Reed Copsey

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.

35
Jeff Roe

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
2
ArekBee

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.

1
Matt Lyons

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.

1
Daniel