【问题标题】:StringDictionary vs Dictionary<string, string>StringDictionary 与 Dictionary<string, string>
【发布时间】:2010-10-12 06:42:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: generics .net-3.5 collections dictionary stringdictionary


    【解决方案1】:

    Dictionary&lt;string, string&gt; 是一种更现代的方法。它实现了IEnumerable&lt;T&gt;,它更适合 LINQy 的东西。

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

    【讨论】:

    • 您应该进行基准测试,看看哪个更适合您的特殊情况。我预计不会有明显的性能差异。我建议对所有新代码使用Dictionary&lt;string,string&gt;(除非您需要针对 1.1)。
    • @thecoop 现在没有硬数据可以从我这里呈现出来,但是有一次我测试速度时StringDictionary 的表现更差(尽管大多数情况下这些都无关紧要)。老实说,事实上,早些时候我认为StringDictionary 是某种专门的集合,用于加速事情,而string 是关键,令我惊讶的是,当它在我的测试中表现更差时,我只用谷歌搜索它学习它是非泛型的
    • @nawfal 我认为它更慢,因为 StringDictionary 默认情况下不区分大小写。如果您使用不区分大小写的键比较器创建字典,那么我相信性能将是相同的
    【解决方案2】:

    还有一点。

    这将返回 null:

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

    这会引发异常:

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

    【讨论】:

    • Dictionary&lt;&gt; 的“抛出异常”功能 意味着我永远无法使用[]。使用 StringDictionary 清理了我的大部分代码。
    • @James 我有点晚了,但你应该使用 TryGetValue。
    • @ŞafakGür -- 我 使用 TryGetValue() -- 因为我永远无法使用 [ ],因为它会引发异常。 (StringDictionary 仅针对一种类型的字典解决此问题)
    • @James,我相信为不存在的键抛出异常是更好的 API 选择,因为允许 null 作为字典值。这样你就可以区分一个不存在的键和一个值为空的键。
    • @ŞafakGür 这是真的——如果您需要一个字典,它 a) 应该始终包含所有值,b) 可以包含空值,c) 这些空值表示与“无值”不同的东西。 . 但是,在字典中“没有值”通常由不存在的键表示。但是,Dictionary 抛出异常的真正原因是该值可能是值类型(因此,不能用 null 表示)。
    【解决方案3】:

    正如 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 比现代与老式差异更重要。

    【讨论】:

    • 如果出于某种原因想要与 Dictionary 相同的行为,可以使用: Dictionary ht = new Dictionary(StringComparer.OrdinalIgnoreCase); ht.Add("鲍勃", "ff"); ht.Add("bob", "ff"); // 抛出异常
    【解决方案4】:

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

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

    见:

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

    【讨论】:

    • StringDictionary 可以在Properites.Settings 中使用,而Dictionary&lt;string,string&gt; 不能。不管是否过时,StringDictionary 仍有一些用处。
    【解决方案5】:

    StringDictionary 来自 .NET 1.1 并实现了IEnumerable

    Dictionary&lt;string, string&gt; 来自 .NET 2.0 并实现了IDictionary&lt;TKey, TValue&gt;,IEnumerable&lt;KeyValuePair&lt;TKey, TValue&gt;&gt;, IEnumerable

    IgnoreCase 仅针对 StringDictionary 中的 Key 设置

    Dictionary&lt;string, string&gt; 适合 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】:

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

      【讨论】:

      • 我们可以在这里使用一些数字
      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 2011-07-19
        • 2010-09-24
        • 1970-01-01
        • 2012-09-21
        • 2012-03-01
        • 2011-03-01
        • 1970-01-01
        • 2017-06-07
        • 1970-01-01
        相关资源
        最近更新 更多