77

有谁知道 System.Collections.Specialized.StringDictionary 对象和 System.Collections.Generic.Dictionary 之间的实际区别是什么?

我过去都使用过它们,并没有过多考虑哪个性能更好,与 Linq 一起工作更好,或者提供任何其他好处。

关于为什么我应该使用一个而不是另一个的任何想法或建议?

4

7 回答 7

92

Dictionary<string, string>是一种更现代的方法。它实现IEnumerable<T>并且更适合 LINQy 的东西。

StringDictionary是老派的方式。它在仿制药时代之前就已经存在。我只会在与遗留代码交互时使用它。

于 2009-03-09T19:49:05.143 回答
43

还有一点。

这将返回 null:

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

这会引发异常:

Dictionary<string, string> dic = new Dictionary<string, string>();
return dic["Hey"];
于 2011-01-12T14:33:48.117 回答
40

正如 Reed Copsey 指出的那样,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);
    }
}

我添加这个回复是为了引起人们对这个巨大差异的更多关注,IMO 比现代与老式的差异更重要。

于 2011-07-22T17:28:07.720 回答
39

我认为 StringDictionary 已经过时了。它存在于框架的 v1.1 中(泛型之前),所以它在当时是一个优越的版本(与非泛型字典相比),但在这一点上,我不相信它有任何特定的优势在字典。

但是,StringDictionary 也有缺点。StringDictionary 自动将您的键值小写,并且没有用于控制它的选项。

看:

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

于 2009-03-09T19:50:34.857 回答
3

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
于 2011-11-10T14:44:28.200 回答
1

除了作为一个更“现代”的类之外,我注意到 Dictionary 比 StringDictionary 的内存效率大大提高。

于 2011-02-15T23:15:29.267 回答
1

另一个相关点是(如果我在这里错了,请纠正我)System.Collections.Generic.Dictionary不能在应用程序设置(Properties.Settings)中使用,而System.Collections.Specialized.StringDictionaryis.

于 2012-11-12T05:28:57.433 回答