2009-03-06 15 views
29

私は、NameValueCollectionまたはIDictionaryのいずれかを使用できるシナリオがあります。しかし、どちらがパフォーマンスに優れているかを知りたい。IDictionary <string、string>またはNameValueCollection

- NameValueCollectionの

NameValueCollection options() 
{ 
    NameValueCollection nc = new NameValueCollection(); 

    nc = ....; //populate nc here 

    if(sorting) 
     //sort NameValueCollection nc here 

    return nc; 
} 

を使用する - これらのコレクション型のIDictionary

IDictionary<string, string> options() 
{ 
    Dictionary<string, string> optionDictionary = new Dictionary<string, string>(); 

    optionDictionary = ....; //populate 

    if(sorting) 
     return new SortedDictionary<string, string>(optionDictionary); 
    else 
     return optionDictionary; 
} 

答えて

28

を使用して、正確に交換することはできません:NameValueCollectionのは、整数インデックスを経由してアクセスすることができます。この機能が必要ない場合は、「無料で」インデックスが作成されないため、NameValueCollectionを使用しないでください。

あなたが見ている文字列の数に応じて、私はハッシュテーブルかIDictionaryを考えます。 Krzysztof Cwalinaはここで微妙なことを話します:http://blogs.gotdotnet.com/kcwalina/archive/2004/08/06/210297.aspx

+11

NameValueCollectionは、キーごとに複数の値(クエリ文字列などに必要)もサポートしています。 –

+15

namevaluecollectionに関するこのmsdnの記事によると:http://msdn.microsoft.com/en-us/library/system.collections.specialized.namevaluecollection.aspx "この種類のコレクションは要素の順序を保持しません。コレクションを列挙するときに特定の順序が保証されます。 – kateroh

9

IDictionaryのもう1つの利点は、NameValueCollectionと違って実装固有のものではないということです。

+0

「具体化特有」とはどういう意味ですか? –

+0

'NameValueCollection'は具体的な型です。 'IDictionary'はインターフェースです。したがって、インターフェイスでは、そのインターフェイスを実装する具体的なクラスを使用できるので、柔軟性が向上します。 – Fred

4

私はfatcatとlomaxxに同意します(そして、両方の回答については、上の投票)。コレクション型の中から選択するとき、コレクション型のパフォーマンスが最後の考慮事項になる可能性が高いと付け加えます。使用目的に最も適したタイプを使用してください。あなたがコードのパフォーマンスクリティカルなセクションにいるならば、唯一の答えはそれぞれのケースを測定することです - インターウェブを信じてはいけません、数字を信じてください。

+0

インターウェブ警告の+1。 Aristotelianであり、トリビュウムの使用を促進するためのJack Blackの方法です。 –

+0

本当ですか?パフォーマンスが異なるコレクションの種類が存在する理由の1つではありませんか?それ以外の場合は、リストをすべて使用しています。 – Spongman

2

.NETのNameValueCollectionは、基本的に、キーと値のペアを保持するためにQueryStringに使用されるものです。最大の違いは、同じキーを持つ2つのアイテムが追加された場合です。 IDictionaryでは、値を設定する2つの方法があります。 .Add()メソッドを使用すると、キーがすでに存在するときに重複キーにエラーがスローされます。しかし、単純に項目を値に設定すると値が上書きされます。これは、IDictionaryが重複キーを処理する方法です。しかし、NameValueCollectionは、 "value1、value2、value3"のような値を追加します。そのため、既存の項目の値にカンマが追加され、そのたびに新しい値が追加されます。

このNameValueCollectionは、QueryStringの使用とアクセス専用に作成されたようです。 .NETで "?a = 1 & b = 2 & a = 3"のようなQueryStringは、アイテム["a"] = "1,3"の結果を生成します。重複キーがどのように扱われるかというこの違いは、実際の違い、つまり両者の最大の違いです。

lsuspect NameValueCollectionは、コレクションが大きいときにキーの迅速なアクセスのためにハッシュテーブルを使用しないため、ハッシュテーブルを使用しない場合よりも小さなコレクションではアクセスが遅くなるためです。 NameValueCollectionがキーにアクセスするためにハッシュテーブルを使用するか使用しないかを明示する明確な情報は見つかりませんでした。 I IDictionaryはハッシュテーブルを使用しているため、多くのキーを持つIDictionaryのキーにアクセスするのは非常に高速です。だから私容疑者 NameValueCollection IDictionaryより小さなコレクションの方が速いです。私の推測が正しいならば、大規模なコレクションのためにNameValueCollectionを使用することは決して意味がありません。それは、キーにアクセスするためのハッシュテーブルなしで大規模に遅くなるからです。クエリ文字列内のキーの数については

、この数は、通常は非常に小さいので、私はNameValueCollectionのは、パフォーマンスを向上させるため、ない利用ハッシュを行い推測をwudを。しかし、マイクロソフトがパフォーマンスのために設計したもので、ユーザーのために最善を尽くすものがあれば、Windowsはなので、今日とは異なるです。だから、私たちは「恥ずかしがり屋」であると仮定することはできません。

また、私は、この質問に対する最も一般的に投票された回答によって誤ったクレームを明確にしたいと思います。間違った答えの下のKaterohのコメントは、それに何も追加する必要はないとうまく言います。しかし、私はここでKaterohのコメントを繰り返します。だから多分もっと多くの人々が最も一般的な答えはが間違っていることを理解するでしょう。 Katerohは正しく状態:

関連する問題