74 votes

StringDictionary vs Dictionnaire<string, string>

Quelqu'un a-t-il une idée des différences pratiques entre l'objet System.Collections.Specialized.StringDictionary et System.Collections.Generic.Dictionary ?

J'ai utilisé les deux dans le passé sans trop me demander lequel des deux serait le plus performant, fonctionnerait mieux avec Linq ou présenterait d'autres avantages.

Avez-vous des idées ou des suggestions sur les raisons pour lesquelles je devrais utiliser l'un plutôt que l'autre ?

88voto

Mehrdad Afshari Points 204872

Dictionary<string, string> est une approche plus moderne. Elle met en œuvre IEnumerable<T> et c'est plus adapté pour les trucs LINQy.

StringDictionary est la méthode de la vieille école. Elle existait avant l'époque des génériques. Je ne l'utiliserais que lors de l'interfaçage avec du code hérité.

41voto

joshcomley Points 9308

Un autre point.

Cela renvoie un résultat nul :

StringDictionary dic = new StringDictionary();
return dic["Hey"];

Une exception est alors levée :

Dictionary<string, string> dic = new Dictionary<string, string>();
return dic["Hey"];

36voto

Reed Copsey Points 315315

Je pense que StringDictionary est plutôt obsolète. Il existait dans la v1.1 du framework (avant les génériques), donc c'était une version supérieure à l'époque (par rapport au Dictionary non générique), mais à ce stade, je ne pense pas qu'il y ait d'avantages spécifiques par rapport au Dictionary.

Cependant, StringDictionary présente des inconvénients. StringDictionary met automatiquement vos valeurs clés en minuscules et il n'y a pas d'option pour contrôler cela.

Ver:

http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/59f38f98-6e53-431c-a6df-b2502c60e1e9/

35voto

Jeff Roe Points 1175

Comme Reed Copsey l'a souligné, StringDictionary met en minuscules les valeurs de vos clés. Pour moi, c'était totalement inattendu, et c'est un coup d'arrêt.

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 afin d'attirer davantage l'attention sur ce point. énorme qui, selon moi, est plus importante que la différence entre moderne et old-school.

2voto

ArekBee Points 131

StringDictionary vient de .NET 1.1 et implémente IEnumerable

Dictionary<string, string> vient de .NET 2.0 et implémente IDictionary<TKey, TValue>,IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable

La fonction IgnoreCase n'est définie que pour la clé dans le champ 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X