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
есть.