NameValueCollection vs Dictionary <string,string>

fra*_*lic 92 .net c# collections dictionary namevaluecollection

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

我应该使用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
}
Run Code Online (Sandbox Code Playgroud)

选项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
}
Run Code Online (Sandbox Code Playgroud)

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

Kel*_*tex 121

它们在语义上不相同.在NameValueCollection可以同时复制钥匙Dictionary不能.

就个人而言,如果你没有重复的密钥,那么我会坚持使用Dictionary.它更现代,用途IEnumerable<>更容易与Linq查询混合.您甚至可以Dictionary使用该Linq ToDictionary()方法创建一个.

  • `NameValueCollection`继承自`NameObjectCollectionBase`,它实现了`IEnumerable`,因此它也可以枚举并可用于LINQ. (6认同)

Joh*_*n K 16

NameValueCollection是字符串类型,而Dictionary利用泛型来允许类型方差.请参阅泛型的好处.


cod*_*ife 10

字典会快得多.NameValueCollection允许重复键.这在某些情况下可能是坏的,或在其他情况下是期望的.字典不允许重复键.

来自:http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

Dictionary <(Of <(TKey,TValue>)>)泛型类提供从一组键到一组值的映射.字典的每个添加都包含一个值及其关联的键.通过使用其键来检索值非常快,接近于O(1),因为Dictionary <(Of <(TKey,TValue>)>)类被实现为哈希表.