オブジェクトを のキーとして使用したい場合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.