99

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

有什么理由我应该使用 Dictionary<string,string> 而不是 NameValueCollection?

(在 C#/.NET 框架中)

选项 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
}

对于这些用例,使用其中一种与另一种相比有什么优势吗?性能、内存使用、排序顺序等有什么不同吗?

4

3 回答 3

130

它们在语义上并不相同。NameValueCollection可以有重复的键,而不能Dictionary

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

于 2010-06-08T20:41:34.337 回答
19

NameValueCollectionstring类型化的,而Dictionary利用泛型来允许类型变化。请参阅泛型的好处

于 2010-06-08T20:55:35.283 回答
10

Dictionary会快得多。NameValueCollection允许重复键。这在某些情况下可能是不好的,或者在其他情况下是需要的。 Dictionary不允许重复键。

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

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

于 2010-06-08T20:59:22.147 回答