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?

70
demandé sur Scott Ivey 2009-03-09 22:44:23

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.

84
répondu Mehrdad Afshari 2009-03-09 19:49:05

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"];
36
répondu joshcomley 2011-01-12 14:33:48

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 /

34
répondu Reed Copsey 2009-03-09 19:50:34

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.

30
répondu Jeff Roe 2014-07-08 16:12:33

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
2
répondu ArekBee 2011-11-10 14:44:28

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.

1
répondu Daniel 2011-02-15 23:15:29

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.

1
répondu Matt Lyons 2012-11-12 05:28:57