7

C#のジェネリックコレクションについて質問があります。アイテムのコレクションを保存する必要があり、アイテムがコレクションに含まれているかどうかを頻繁に確認する必要がある場合、リストの代わりに辞書を使用する方が速いでしょうか?

アイテムがコレクションにあるかどうかのチェックは、リストのサイズに対して線形であり、辞書のサイズに対して一定であると聞きました。辞書を使用してから、キーと値をキーと値のペアごとに同じオブジェクトに設定することは、他のプログラマーがこの状況で頻繁に行うことですか?

これをお読みいただきありがとうございます。

4

6 に答える 6

5

はい、そうです。HashSetとはいえ、キーと値の両方は必要なく、アイテムのセットが必要なだけなので、おそらく使用したいと思うでしょう。

Dictionaryまた、C#2.0で追加され、3.5で追加されたことも注目に値しHashSetます。そのため、その間は、セットが必要なときに辞書を使用するのが実際にはかなり一般的でした。 。これを強制されたとき、キーと値としての項目ではなく、値にnullを貼り付けましたが、考え方は同じです。

于 2012-05-15T20:46:18.460 に答える
5

HashSet<Foo>懸念しているのが高速封じ込めテストである場合にのみ使用してください。

ADictionary<TKey, TValue>は、キーに基づいて値を検索するためのものです。

AList<T>は、ランダムアクセスおよび動的成長プロパティ用です。

AHashSet<T>は、セットをモデル化し、高速封じ込めテストを提供するためのものです。

キーに基づいて値を検索しているのではありません。ランダムアクセスについて心配する必要はありませんが、封じ込めチェックを高速化する必要があります。ここでの正しい概念はですHashSet<T>

于 2012-05-15T20:46:21.730 に答える
5

リストにアイテムのコピーが1つしかない場合、適切なデータ構造はISet<T>、具体的にはHashSet<T>です。

Dictionary<TKey, TValue> ContainsKeyとは言うものの、呼び出しがさらに少し速いことを示すタイミングを見てきましたHashSet<T>。いずれにせよ、どちらも単純なList<T>ルックアップよりも高速にロードされます。

これらのメソッド(HashSetとDictionary)はどちらも、の実装が適切に実装されていることに依存していることに注意しEquals GetHashcodeくださいTList<T>のみに依存しますEquals

于 2012-05-15T20:46:30.597 に答える
3

辞書またはHashSetはより多くのメモリを使用しますが、(ほぼ)O(1)シーク時間を提供します。

于 2012-05-15T20:46:27.290 に答える
2

一意のオブジェクトのコレクションであるHashSetを確認することをお勧めします(オブジェクトがIEquality比較を実装している場合)。

于 2012-05-15T20:47:20.403 に答える
1

の使用について言及しましList<T>たが、これは順序付けが重要である可能性があることを意味します。この場合は、SortedSet<T>タイプも調べてください。

于 2012-05-17T14:11:24.960 に答える