StringDictionary vs字典<string,string>


76

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

过去,我都曾使用过它们,而没有考虑过哪种性能更好,与Linq更好地配合使用或提供其他好处。

关于我为什么要在另一个上使用的任何想法或建议?

Answers:


90

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

StringDictionary是老派的方式。仿制药问世之前就在那里。我只会在与遗留代码接口时使用它。


您应该进行基准测试,以查看哪种方式在您的特殊情况下效果更好。我不希望有明显的性能差异。我建议Dictionary<string,string>对所有新代码都使用(除非您需要定位到1.1)。
Mehrdad Afshari

2
@thecoop现在没有从我这边提供的硬数据,但是有一次我进行速度测试时StringDictionary表现较差(尽管多数情况下都不重要)。坦白说,实际上,我之前有一个概念,那StringDictionary就是某种专门的集合,旨在string在关键时加快速度,而令我惊讶的是,当它在我的测试中表现较差时,我在Google上搜索了一下,只是发现它是非通用的
nawfal

1
@nawfal我认为它比较慢,因为StringDictionary默认情况下不区分大小写。如果您使用不区分大小写的键比较器创建一个Dictionary,那么我相信性能会是一样的
phuclv

41

还有一点。

返回null:

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

这将引发异常:

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

该“抛出一个异常”功能Dictionary<>手段,我可以永远使用[]。使用StringDictionary已清理了我的大部分代码。
詹姆斯·柯伦

1
@James我来晚了一点,但是您应该使用TryGetValue。
Şafak古尔

@ŞafakGür-我确实使用TryGetValue()-[ ]因为它会引发异常,所以我从不使用。(StringDictionary仅针对一种类型的词典解决此问题)
James Curran

@James,我相信对不存在的键抛出异常是一个更好的API选择,因为允许null作为字典值。这样,您就可以区分一个不存在的键和一个值为null的键。
Şafak古尔

1
@ŞafakGür这是正确的-如果您需要一本字典,其中a)应该始终具有所有值,b)可以包含空值,并且c)这些空值表示不同于“无值”的东西。值”通常由不存在的键表示。但是,Dictionary <>抛出异常的真正原因是因为该值可能是值类型(因此不能用null表示)。
James Curran

37

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


4
如果出于某种原因希望在Dictionary <string,string>上具有相同的行为,可以使用以下方法:Dictionary <string,string> ht = new Dictionary <string,string>(StringComparer.OrdinalIgnoreCase); ht.Add(“ Bob”,“ ff”); ht.Add(“ bob”,“ ff”); //引发异常
osexpert

36

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

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

看到:

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


2
StringDictionary可以使用Properites.Settings,而Dictionary<string,string>不能。不管它是否过时,仍然有一些用途StringDictionary
Jahu

2

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

除了是一个更“现代”的类,我还注意到Dictionary在很大程度上比StringDictionary的内存效率更高。


11
我们可以在此处使用一些数字
Zonko

1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.