2009-06-08 9 views
1

私はHashSet<T>を使用してオブジェクトのコレクションを格納しています。これらのオブジェクトはすでにSystem.Guidの一意のIDを持っていますので、むしろHashSet<>はオブジェクトをハッシュする方法を理解するのではなく、既存のIDを使用します。ハッシュのビルドをオーバーライドし、ハッシュ値としてID値のビルドを使用するようにプログラムを強制するにはどうすればよいですか?オブジェクトをハッシュセットでハッシュする方法を制御するには

もこれだけGuidに基づいてHashSet<T>からオブジェクトを取得する方法があり、私は私のHashSet<>でオブジェクトのGuidを知っていると言いますか?あるいは、代わりに辞書を使うべきですか?

答えて

4

HashSet<>は、キーと値のペアに基づいていないため、「キーで」アクセスすることはできません。

キー/値のペア(後でGuidをフェッチする)を使用するには、最も簡単なオプションはDictionary<Guid,SomeType>です。あなたは(あなたがいないここで行う)を必要に応じてはあなたがハッシュに使用するIEqualityComparer<T>を提供することができるがGuid上の既存のハッシュコードは(問題ないはずです。

1

なぜこれを無効にする必要がありますか?おそらく時期尚早の最適化のようだ。

ええ、ちょうど辞書を使用してください。アプリケーションを開発したら、すべてのコードのパフォーマンスを測定するパフォーマンスチューニングフェーズに進みます。場合によっては、このハッシュ関数が最大の排水として表示される場合は、より効果的なデータ構造(とにかくある場合):-)

1

System.KeyedCollectionを調べてみてください。キーフィールドの知識をコレクションの実装に埋め込むことができます。

+0

KeyedCollectionはデフォルトで内部的に辞書を使用するため、ここでは注意してください.-Pドキュメントより "デフォルトで、KeyedCollection には検索が含まれています辞書。アイテムがKeyedCollection に追加されると、そのアイテムのキーが一度抽出され、検索の高速化のためにルックアップ辞書に保存されます。 " –

3

オーバーライドあなたのオブジェクトのGetHashCode()方法。

もちろん、ちょっとしたシワがあります... GUIDはint32より大きいので、.NETがハッシュコードに使用します。

+0

"このGUIDだけに基づいてHashSetからオブジェクトを取得するのには役に立ちません " –

+0

@Marc :質問の最初の部分は、 "これらのオブジェクトは既にSystem.Guidの一意のIDを持っているので、むしろHashSetはオブジェクトをハッシュする方法を理解しようとする代わりに既存のIDを使用するだけです"もちろん、GUIDがint32の4倍のサイズになるというわずかな問題があります。 – Powerlord

関連する問題