web-dev-qa-db-ja.com

NameValueCollection vs Dictionary <string、string>

可能性のある複製:
IDictionary <string、string>またはNameValueCollection

NameValueCollectionの代わりにDictionary <string、string>を使用する必要がある理由は何ですか?

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

これらのユースケースでは、一方を他方に使用する利点はありますか?パフォーマンス、メモリ使用、ソート順などに違いはありますか?

92
frankadelic

それらは意味的に同一ではありません。 NameValueCollectionは重複キーを持つことができますが、Dictionaryはできません。

個人的に、重複キーがない場合は、Dictionaryを使い続けます。それはより近代的で、Linqクエリを簡単に混ぜることができる_IEnumerable<>_を使用しています。 DictionaryToDictionary()メソッドを使用してLinqを作成することもできます。

120
Keltex

NameValueCollectionは文字列型ですが、Dictionaryはジェネリックを活用して型の差異を許可します。 ジェネリックの利点 を参照してください。

16
John K

辞書ははるかに高速になります。 NameValueCollectionは、重複キーを許可します。特定の状況では悪いこともあれば、他の状況では望ましいこともあります。辞書では重複キーは許可されません。

From: http://msdn.Microsoft.com/en-us/library/xfhwa508.aspx

Dictionary <(Of <(TKey、TValue>)>)ジェネリッククラスは、キーのセットから値のセットへのマッピングを提供します。辞書への各追加は、値とそれに関連付けられたキーで構成されます。 Dictionary <(Of <(TKey、TValue>)>)クラスはハッシュテーブルとして実装されているため、キーを使用した値の取得は非常に高速で、O(1)に近くなります。

10
code4life