2016-08-04 6 views
0

VS2013、.Net 4.5.2。私はGetHashCodeメソッドは、それぞれの比較のために呼ばれたが等しいことはありませんされているデバッグモードで見つけていますIEqualityComparer 012zzの不思議な動作、Equals()メソッドのブレークポイントがヒットしない

public class OptionComparer : EqualityComparer<Option> 
{ 

    public override bool Equals(Option x, Option y) 
    { 
     //Check whether the objects are the same object. 
     if (Object.ReferenceEquals(x, y)) return true; 
     //Check whether the options have the same Entry value. 
     return x != null && y != null && x.OptionEntry.Equals(y.OptionEntry); 
    } 

    public override int GetHashCode(Option obj) 
    { 
     //Get hash code for the OptionSection field if it is not null. 
     int hashOptionSection = obj.OptionSection == null ? 0 : obj.OptionSection.GetHashCode(); 

     //Get hash code for the OptionEntry field. 
     int hashOptionEntry = obj.OptionEntry.GetHashCode(); 

     //Calculate the hash code for the Option. 
     return hashOptionSection^hashOptionEntry; 
    } 
} 

は、このコード

  var opCollectionA = new List<Option>() 
      { 
       ...some elements added here.. 
      }; 

      var opCollectionB = new List<Option>() 
      { 
       ...some elements added here.. 
      }; 

      var InAandB = opCollectionA.Except(opCollectionB, new OptionComparer()).ToArray(); 

と、この比較演算子クラスを考えます。その結果、私の比較人は、望ましい結果を得られません。

誰でもこれを説明できますか?

TIA。

+0

'GetHashCodeメソッド()'の目的だこと:2つのインスタンスのハッシュコードが異なる場合は、 'Equals()'を呼び出す必要はありません。別のハッシュコードはすでにインスタンスが異なることを意味しています。 –

+0

したがって、 'GetHashCode()'が実際に等しいと思うインスタンスに対して異なる結果を返す場合、実装は間違っています。 –

答えて

3

ハッシュコードを使用して比較を高速化します。だから、GetHashCode()の実装はEqualsより速いはずです。

GetHashCode()必須リターン(Equals()trueを返すことを意味する "等しい")等しいオブジェクトの等しいハッシュコード。

(例えば文字列の)各異なるオブジェクトの異なるハッシュコードを有するのに十分なint値が存在しないので、当然同じハッシュコードを共有異なるオブジェクトが存在するであろう。

GetHashCode() 2つのオブジェクトのための同じハッシュコードを返した場合、Equals()は、彼らが実際に等しいかどうかを判断するために呼び出さなければなりません。しかし、GetHashCode()が異なる値を返した場合、これらのオブジェクトは等価ではなく、通常はもっと高価なEquals()メソッドを呼び出す必要はありません。

結論:あなたのコードで

あなたはそれらのOptionEntryが等しい場合に等しくなるように2つのOptionのを期待しているようです。だからあなたの問題を解決する最も簡単な方法は、それが単にOptionEntryのハッシュコードを返すように、あなたのGetHashCode()を変更することです:

public override int GetHashCode(Option obj) 
{ 
    return obj.OptionEntry.GetHashCode(); 
} 
+0

ありがとうございます。それは問題を説明します。 –

関連する問題