StringDictionary против словаря <строка, строка> - PullRequest
72 голосов
/ 09 марта 2009

Кто-нибудь знает, каковы практические различия между объектом System.Collections.Specialized.StringDictionary и System.Collections.Generic.Dictionary?

Я использовал их обоих в прошлом, не задумываясь о том, какие из них будут работать лучше, работать лучше с Linq или предоставлять какие-либо другие преимущества.

Какие-нибудь мысли или предложения относительно того, почему я должен использовать одно поверх другого?

Ответы [ 7 ]

86 голосов
/ 09 марта 2009

Dictionary<string, string> - более современный подход. Он реализует IEnumerable<T> и больше подходит для LINQy.

StringDictionary - это старый школьный путь. Это было там до дней дженериков. Я бы использовал его только при взаимодействии с устаревшим кодом.

39 голосов
/ 12 января 2011

Еще один момент.

Возвращает ноль:

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

Это исключение:

Dictionary<string, string> dic = new Dictionary<string, string>();
return dic["Hey"];
36 голосов
/ 09 марта 2009

Я думаю, что StringDictionary в значительной степени устарел. Он существовал в v1.1 фреймворка (до обобщения), поэтому в то время это была улучшенная версия (по сравнению с неуниверсальным словарем), но на данный момент я не верю, что есть какие-то конкретные преимущества по словарю.

Однако у StringDictionary есть свои недостатки. StringDictionary автоматически вводит значения ключей в нижнем регистре, и нет никаких вариантов для управления этим.

См:

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

33 голосов
/ 22 июля 2011

Как отметил Рид Копси, StringDictionary строчными буквами значения вашего ключа. Для меня это было совершенно неожиданно, и это шоу-стопор.

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);
    }
}

Я добавляю этот ответ, чтобы привлечь больше внимания к этой огромной разнице, которая ИМО важнее, чем разница между современной и старой школой.

2 голосов
/ 10 ноября 2011

StringDictionary взято из .NET 1.1 и реализует IEnumerable

Dictionary<string, string> взято из .NET 2.0 и реализует IDictionary<TKey, TValue>,IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable

IgnoreCase устанавливается только для ввода StringDictionary

Dictionary<string, string> хорошо для 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
1 голос
/ 12 ноября 2012

Другим важным моментом является то, что (поправьте меня, если я ошибаюсь) System.Collections.Generic.Dictionary не может использоваться в настройках приложения (Properties.Settings), тогда как System.Collections.Specialized.StringDictionary - это.

1 голос
/ 16 февраля 2011

Помимо того, что это более «современный» класс, я заметил, что Dictionary с большим отрывом эффективнее использует память, чем StringDictionary.

...