オブジェクトのフィールドを汎用辞書キーとして使用する 質問する

オブジェクトのフィールドを汎用辞書キーとして使用する 質問する

オブジェクトを のキーとして使用したい場合Dictionary、特定の方法で比較するにはどのメソッドをオーバーライドする必要がありますか?

次のようなプロパティを持つクラスがあるとします。

class Foo {
    public string Name { get; set; }
    public int FooID { get; set; }

    // elided
} 

そして、私は以下を作成したいと考えています。

Dictionary<Foo, List<Stuff>>

Foo同じオブジェクトをFooID同じグループとして扱いたいのですが、Fooクラス内でどのメソッドをオーバーライドする必要がありますか?

Stuff要約すると、オブジェクトをオブジェクトごとにグループ化したリストに分類したいですFoo。オブジェクトには、カテゴリにリンクするための がStuffあります。FooID

ベストアンサー1

デフォルトでは、2 つの重要なメソッドはGetHashCode()と ですEquals()。2 つのものが等しい場合 ( は true を返します)、それらのハッシュ コードが同じであることが重要です。たとえば、を一致させたい場合、Equals()として「FooID を返す」ことができます。 を実装することもできますが、これはオプションです。GetHashCode()IEquatable<Foo>

class Foo : IEquatable<Foo> {
    public string Name { get; set;}
    public int FooID {get; set;}

    public override int GetHashCode() {
        return FooID;
    }
    public override bool Equals(object obj) {
        return Equals(obj as Foo);
    }
    public bool Equals(Foo obj) {
        return obj != null && obj.FooID == this.FooID;
    }
}

Finally, another alternative is to provide an IEqualityComparer<T> to do the same.

おすすめ記事