StringDictionary vs Dictionary <строка, строкa>

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

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

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

Ответ 1

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

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

Ответ 2

Еще одна точка.

Это возвращает null:

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

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

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

Ответ 3

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

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

См:

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

Ответ 4

Как заметил Рид Копси, 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);
    }
}

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

Ответ 5

StringDictionary происходит из .NET 1.1 и реализует IEnumerable

Dictionary<string, string> происходит от .NET 2.0 и реализует IDictionary<TKey, TValue>,IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable

IgnoreCase устанавливается только для Key in 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

Ответ 6

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

Ответ 7

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