StringDictionary vs Dictionary < string,string >

有没有人知道这个系统之间的实际差异是什么。收款。专业的。StringDictionary 对象和系统。收款。通用的。字典?

我在过去都使用过它们,没有考虑过哪一个会表现得更好,与 Linq 一起工作得更好,或者提供任何其他好处。

对于为什么我应该使用一个而不是另一个,有什么想法或建议吗?

26402 次浏览

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

StringDictionary是老派的方法。在仿制药出现之前就有了。我只会在与遗留代码接口时使用它。

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

然而,StringDictionary 也有缺点。StringDictionary 会自动将您的键值小写,并且没有控制此项的选项。

参见:

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

还有一点。

返回 null:

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

这抛出了一个例外:

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

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

正如 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);
}
}

我添加这个回答,以提请更多的注意这个 巨大的差异,其中国际海事组织是更重要的比现代与老学校的差异。

StringDictionary来自.NET 1.1并实现了 IEnumerable

Dictionary<string, string>来自.NET 2.0并实现了 IDictionary<TKey, TValue>,IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable

IgnoreCase 仅在 StringDictionary中为 Key 设置

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

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