我应该使用Dictionary< string,string>而不是NameValueCollection?
(在C#/ .NET Framework中)
选项1,使用NameValueCollection:
//enter values:
NameValueCollection nvc = new NameValueCollection()
{
{"key1", "value1"},
{"key2", "value2"},
{"key3", "value3"}
};
// retrieve values:
foreach(string key in nvc.AllKeys)
{
string value = nvc[key];
// do something
}
选项2,使用Dictionary< string,string> ...
//enter values:
Dictionary<string, string> dict = new Dictionary<string, string>()
{
{"key1", "value1"},
{"key2", "value2"},
{"key3", "value3"}
};
// retrieve values:
foreach (KeyValuePair<string, string> kvp in dict)
{
string key = kvp.Key;
string val = kvp.Value;
// do something
}
对于这些用例,使用一个与另一个相比是否有任何优势?性能,内存使用,排序顺序等方面的差异?
答案 0 :(得分:118)
它们在语义上不相同。 NameValueCollection
可以有重复键,而Dictionary
则不能。
就个人而言,如果你没有重复的密钥,那么我会坚持使用Dictionary
。它更现代,使用IEnumerable<>
,可以轻松地与Linq
查询混合。您甚至可以使用Dictionary
Linq
方法创建ToDictionary()
。
答案 1 :(得分:16)
NameValueCollection是字符串类型,而Dictionary利用泛型来允许类型方差。请参阅Benefits of Generics。
答案 2 :(得分:10)
字典会快得多。 NameValueCollection允许重复键。这在某些情况下可能是坏的,或在其他情况下是期望的。字典不允许重复键。
来自:http://msdn.microsoft.com/en-us/library/xfhwa508.aspx
The Dictionary&lt;(Of&lt;(TKey,TValue&gt;)&gt;) 泛型类提供了一个映射 一组值的一组键。每 除了字典之外还包括 值及其关联键。 使用其键检索值是 非常快,接近O(1),因为 字典&lt;(Of&lt;(TKey,TValue&gt;)&gt;) class被实现为哈希表。