質問
実装するCLRの観点とは違うのでしょうか IEqualityComparer
vsオーバーライド ==
で使用するプロパティのオペレーター IEqualityComparer<T>
?もしそうなら、いつ一方を他方に対して使用しますか?
編集
Hashtableの実装で使用されているieqaulitycompererが、質問を投稿していたときに私の心から抜け出したことは理にかなっています。 IenumerableのLinqの拡張はどうでしょうか。それは、そのような拡張メソッドを実行するときに.NETがハッシュテーブルを構築することを意味しますか?
解決
IEqualityComparer
ではありません equal
, 、Equalはオブジェクト(インスタンスメソッド)用ですが、EqualityComparerは装飾用です。
personList.OrderBy(p=>p.ID).Distinct(new MyEqualityComparer())
と
class MyEqualityComparer: IEqualityComparer<Person>
{
public bool Equals(Person p1, Person p2)
{
if (p1.Age == p2.Age)
return true;
return false;
}
public int GetHashCode(Person p)
{
return p.Id.GetHashCode();
}
}
しかし、平等は人向けです:
public class Person
{
public int ID{get;set;}
public int Age{get;set;}
public override bool Equals(object o)
{
//do stuff
}
}
IequalityComparerによって任意の数の装飾を行うことはできますが、インスタンスメソッドでこれを行うことはできません(PersonList.Distinct(新しい別の会社)を書くことができます...)
他のヒント
iequalitycomperer によって使用されます ハッシュ表, namevalueCollection と OrderedDictionary あなたのタイプの「平等」のカスタム定義をサポートするためのクラス。それがそれが提供する理由です gethashcode(), 、平等とはあまり関係ありません それ自体.
あなたが提供しない場合 IEqualityComparer
, 、上記のクラスはデフォルトです object.equals(), 、それを実装します 参照平等. 。過負荷 operator ==
その文脈では呼ばれません。
編集: いくつかのLINQの拡張方法は実際に取ります IEqualityComparer
議論として、しかし原則は同じままです。その引数が指定されていない場合、メソッドは値ではなく参照を比較することになります。 operator ==
呼ばれません。
IEqualityComparer
たとえば、比較に使用されます Dictionary<TK,TV>
.
オーバーライドとはまったく異なります ==
実際にオペレーター Dictionary
(そして一般的に何であれ IEqualityComparer
)電話をかけません ==
オペレーター。
せいぜい、「実装」を比較できます IEqualityComparer
「vs」オーバーライド GetHashCode
と Equals
方法」、実際に同じものを得るための2つの方法だからです(そして、私はそれらが私に等しいと言います)。