質問

実装する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 によって使用されます ハッシュ表, namevalueCollectionOrderedDictionary あなたのタイプの「平等」のカスタム定義をサポートするためのクラス。それがそれが提供する理由です gethashcode(), 、平等とはあまり関係ありません それ自体.

あなたが提供しない場合 IEqualityComparer, 、上記のクラスはデフォルトです object.equals(), 、それを実装します 参照平等. 。過負荷 operator == その文脈では呼ばれません。

編集: いくつかのLINQの拡張方法は実際に取ります IEqualityComparer 議論として、しかし原則は同じままです。その引数が指定されていない場合、メソッドは値ではなく参照を比較することになります。 operator == 呼ばれません。

IEqualityComparer たとえば、比較に使用されます Dictionary<TK,TV>.

オーバーライドとはまったく異なります == 実際にオペレーター Dictionary (そして一般的に何であれ IEqualityComparer)電話をかけません == オペレーター。

せいぜい、「実装」を比較できます IEqualityComparer 「vs」オーバーライド GetHashCodeEquals 方法」、実際に同じものを得るための2つの方法だからです(そして、私はそれらが私に等しいと言います)。

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