2011-10-19 9 views
3

多くの状況で、簡単にするために、辞書またはLINQと組み合わせてListまたはHashSetを使用することをお勧めします。しかし、私はDictionaryがそのハッシュテーブルの実装のためにもっとパフォーマンスが良いと思っていたので、私は通常Dictionaryを使用しました。例えばLINQのパフォーマンス対辞書<K,V>

私はLINQでこれを行う:

bool exists = hashset.Any(item => item.Key == someKey); 

私は辞書では、次の同等と比較して有意なパフォーマンスを失うのですか?

bool exists = dictionary.ContainsKey(someKey); // an O(1) operation 

LINQクエリは、辞書に対して正当な選択肢となる何らかの方法で最適化されていますか?または、上記のAny()は、実行されるコレクションのタイプに関係なく、プレーンなO(n)操作ですか?

+0

各アイテム(この場合はtrueを返す)に実行するデリゲートを渡していますので、辞書ルックアップは非常に高速です(いくつかの極端なケースを除いて) – Rob

答えて

9

この場合、Anyextension methodがIEnumerableで定義されているため、ハッシュセットのメリットが排除されます。あたかもハッシュセットをListのように繰り返し、各アイテムに対して==演算子を呼び出すだけです。実際には、これらの2つのコードサンプルは厳密には等価ではありません.LINQステートメントは==演算子を使用し、辞書はハッシュコード/等価を使用します。これらは値型と文字列では同等ですが、すべてのクラスでは同じではありません。あなたは辞書と同じようにダミーの値を維持する必要がHashSetのの最適化されたルックアップを使用し、しません

bool exists = hashset.Contains(item.Key); 

:あなたは何ができるか

はこれです。

+0

しかし、これに遭遇したとき問題は、私は通常Item.Keyのコレクションではなく、Itemのコレクションを格納したいと思う。また、ItemのコレクションをHashSetに格納すると、LINQを使用しない限りKeyで検索することができなくなります。遅いです。そして私は行く唯一の方法と思われる辞書に落ちる。 – asmo

+1

Keyが(フィールドやプロパティなどの)値に埋め込まれている場合、KeyedCollectionをサブクラス化する必要があります。http://msdn.microsoft.com/en-us/library/ms132438.aspxキーが値に埋め込まれていない場合、ディクショナリは正しいデータ構造です。 –

+0

それは私が探していたものです。ありがとう!非常に明確な説明。 – asmo

関連する問題