2016-05-10 11 views
1

GetHashCodeEqualsを実装するクラスを持っている場合、ハッシュを生成するか、Equalsを使用して比較するのではなく、オブジェクトの参照に基づいて比較するキーとしてそのクラスを使用する辞書を強制できますか?クラスがEqualsとGetHashCodeを実装するときに、C#ディクショナリのキーとしてオブジェクト参照をどのように使用しますか?

たとえば、私のリソースにグローバルで変更されていないSystem.Drawing.Bitmapのコレクションがある場合、それらをC++のアドレスに基づいて比較することで、安く辞書のキーとして使用できますか?これらはかなり大きな画像であり、キー検索を行うためにハッシュを一度生成することは嫌です。

私は、これらのオブジェクトをキーとして使用するより最適な方法を期待しています。

答えて

3

あなたはRuntimeHelpers.GetHashCodeに呼び出し、等価比較のためにobject.ReferenceEqualsを使用するカスタムIEqualityComparer、とDictionaryを構築することができます。

var identityDict = new Dictionary<MyKey,MyVal>(
    new IdentityEqualityComparer<MyKey>(); 
); 
+0

素晴らしい仕事:今、あなたは、このような辞書を作ることができ

class IdentityEqualityComparer<T> : IEqualityComparer<T> where T : class { public bool Equals(T v1, T v2) { return object.ReferenceEquals(v1, v2); } public int GetHashCode(T v) { return RuntimeHelpers.GetHashCode(v); } } 

。残念ながら、 'Properties.Resources'プロパティはグローバルではなく、取得するたびに変わるようです。その前提のためには大変です。 – cppguy

0

あなたが調べたいのはデータベースです。 Visual Studioには、SQLデータベースを作成する機能が付属しています。そこから、ある値を別の値にマッピングできます。例:ランダムに生成された文字列をイメージのファイルパスにマップすることができます。私はSystem.Drawingに詳しくはないので、プログラムで生成されたイメージのデータベースを作成できるかどうかはわかりません。

関連する問題