NameValueCollection vs Dictionary <string,string> </string,string>

时间:2010-06-08 20:39:11

标签: c# .net collections dictionary namevaluecollection

  

可能重复:
  IDictionary<string, string> or NameValueCollection

我应该使用Dictionary&lt; string,string&gt;而不是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&lt; string,string&gt; ...

//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
}

对于这些用例,使用一个与另一个相比是否有任何优势?性能,内存使用,排序顺序等方面的差异?

3 个答案:

答案 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被实现为哈希表。