どのように私は、オブジェクトがHashSetのでハッシュ化された方法を制御します

StackOverflow https://stackoverflow.com/questions/967027

  •  12-09-2019
  •  | 
  •  

質問

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

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

役に立ちましたか?

解決

HashSet<>は、キー/値のペアをベースにしており、何の「キーによる」アクセスを提供していないされていない - それは非常に迅速に封じ込めをチェックするためにハッシュを使用して、一意の値のセットだけです。

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

他のヒント

あなたのオブジェクトは、 GetHashCode() のメソッドをオーバーライドしますます。

もちろん、多少のシワがここにあります... GUIDは、.NETは、ハッシュコードのために使用する、int32sよりも大きいます。

なぜあなたはこれをオーバーライドする必要がありますか?おそらく時期尚早な最適化のように思えます。

うん、ただの辞書を使用しています。あなたがあなたのアプリケーションを開発したら、あなたはすべてのコードのパフォーマンスを測定するパフォーマンスチューニング段階を経ます。もしこのハッシュ関数は、(とにかく存在する場合)には、よりパフォーマンスのデータ構造を考慮する必要があり、あなたの最大のドレインであるとして示している場合のみ: - )

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top