4

これはばかげた質問かもしれませんが、私はそれについて読んでHashtablesおりDictionaries、キーを使用してアイテムにインデックスを付けるため、リストよりも高速です。

私は、ListまたArrayはが値のない要素を表し、aが値のある要素を表すことを知ってDictionaryいます。だから私はDictionaryあなたがキーとして必要な値とそれらのすべてで等しい値を持つことは賢明だと思いますか?

更新

コメントに基づいて、私が必要だと思うのはですHashSet。この質問は彼らのパフォーマンスについて話します。

4

3 に答える 3

3

辞書/ハッシュテーブルとリスト/配列にもいくつかの弱点があります。

  • ルックアップごとにオブジェクトのハッシュ値を計算する必要があります。
  • 小さなコレクションの場合、特にハッシュが一意であることが保証されていないため、配列を反復処理する方がそのハッシュを計算するよりも高速になる可能性があります1
  • アイテムのリストを反復処理するのは得意ではありません。
  • 重複するエントリを格納するのはあまり得意ではありません(値を配列に複数回表示することが合法的に必要な場合があります)
  • タイプに関連付けるのに適したキーがない場合があります

状況に合ったものを使用してください。リストや配列になることもあります。時々それは辞書になります。これ以上HashTableを使用することはほとんどありません(保存しているタイプが本当にわからない場合は、Dictionary <KeyType、Object>をお勧めします)。

1通常は一意ですが、衝突の可能性が小さいため、コレクションはハッシュ値を計算した後にバケットをチェックする必要があります。

于 2013-01-31T17:52:51.213 に答える
3

「より速く」はあなたがそれらを何のために必要とするかに依存します。

.NETListは単なる連続メモリのスラブ(これはリンクリストではありません)であり、順次アクセス(特に最新のCPUのキャッシュとプリフェッチの効果を考慮する場合)または既知の整数を介して「ランダムに」アクセスするのに非常に効率的です。索引。要素の検索または挿入(特に中央)-それほど多くはありません。

Dictionaryは連想データ構造です。キーは(整数インデックスだけでなく)ハッシュ可能なものであれば何でもかまいませんが、要素は「意味のある」方法で並べ替えられず、既知のキーを介したアクセスはListの整数インデックスほど高速ではありません。

したがって、その仕事に適したツールを選択してください。

于 2013-01-31T17:55:46.803 に答える
2

「リストまたは配列は値のない要素用であり、辞書は値のある要素用です」というステートメントは厳密には当てはまりません。

より正確には、リストは要素のコレクションであり、ハッシュテーブルまたはディクショナリは、各要素にアクセスするために使用される一意のキーとともに要素のコレクションです。

非常に少数の要素のコレクションにリストを使用するか、コレクションの1つの要素ではなく、コレクション全体にのみアクセスする必要がある場合に使用します。

コレクションが大きい場合、および/またはコレクションの個々のメンバーを検索/アクセスする必要がある場合は、ハッシュテーブルまたはディクショナリを使用します。

于 2013-01-31T17:50:30.367 に答える