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
}
これらのユースケースでは、一方を他方に使用する利点はありますか?パフォーマンス、メモリ使用、ソート順などに違いはありますか?
それらは意味的に同一ではありません。 NameValueCollection
は重複キーを持つことができますが、Dictionary
はできません。
個人的に、重複キーがない場合は、Dictionary
を使い続けます。それはより近代的で、Linq
クエリを簡単に混ぜることができる_IEnumerable<>
_を使用しています。 Dictionary
ToDictionary()
メソッドを使用してLinq
を作成することもできます。
NameValueCollectionは文字列型ですが、Dictionaryはジェネリックを活用して型の差異を許可します。 ジェネリックの利点 を参照してください。
辞書ははるかに高速になります。 NameValueCollectionは、重複キーを許可します。特定の状況では悪いこともあれば、他の状況では望ましいこともあります。辞書では重複キーは許可されません。
From: http://msdn.Microsoft.com/en-us/library/xfhwa508.aspx
Dictionary <(Of <(TKey、TValue>)>)ジェネリッククラスは、キーのセットから値のセットへのマッピングを提供します。辞書への各追加は、値とそれに関連付けられたキーで構成されます。 Dictionary <(Of <(TKey、TValue>)>)クラスはハッシュテーブルとして実装されているため、キーを使用した値の取得は非常に高速で、O(1)に近くなります。