2012-04-25 20 views
0

IEqualityComparerを試してみるのは初めてですが、問題が発生しています。IEqualityComparerを使用して特定の値を確認する

私はちょうどそのコードが舞台裏で何をしているのか正確には分かりません。

私はそれがこのようになります提供していますリスト:

私は()ユニークなSNを持っているアイテムの数、および「再テスト== 1」を個別見つけるために使用しようとしている
Test Run | SN | Retest 
1   185  0 
2   185  1 
3   185  1 
4   185  1 

var result = testRunList.Distinct(new UniqueRetests()); 

と派生IEqualityCompareクラスのようになります。どのような私が探しているが含まれてリストであるのに対し

public class UniqueRetests : IEqualityComparer<TestRunRecord> 
{ 
    // Records are equal if their SNs and retest are equal. 
    public bool Equals(TestRunRecord x, TestRunRecord y) 
    { 
     //Check whether any of the compared objects is null. 
     if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) 
      return false; 

     //Check whether it's a retest AND if the specified records' properties are equal. 
     return x.retest == 1 && y.retest == 1 && x.boardSN == y.boardSN; 
    } 

    // If Equals() returns true for a pair of objects 
    // then GetHashCode() must return the same value for these objects. 

    public int GetHashCode(TestRunRecord record) 
    { 
     //Check whether the object is null 
     if (Object.ReferenceEquals(record, null)) return 0; 

     //Get hash code for the board SN field. 
     int hashRecordSN = record.boardSN.GetHashCode(); 

     //Get hash code for the retest field. 
     int hashRecordRetest = record.retest.GetHashCode(); 

     //Calculate the hash code for the product. 
     return hashRecordSN^hashRecordRetest; 
    } 
} 

問題は、これが最初の2つの項目が含まれて生成するようだということです'retest == 1'の項目は1つだけです。

ここで間違っているのは何ですか?どのように 'retest == 0'のレコードが返されているのですか?条件が偽である場合、それらは等しくないかのように

回答

は、オブジェクトが処理されます。 Distinctは等しくない行を返します。 Btw、あなたはこのタイプのコードでIEqualityComparerの規約に違反しています。結果は実際には未定義です。たとえば、再テスト== 0のオブジェクトよりも、「契約違反」とは、それ自体が不等と比較されます。 - usr

答えて

1

retest = 0の項目を除外する必要があります。.Where(x => x.retest!= 0)をDistinctの前に置きます。

+0

私は、retest == 0のアイテムは、等価ステートメントの条件でretest == 1が必要なときに返されます。 – static416

+1

条件がfalseの場合、オブジェクトはあたかも等しくない。 Distinctは等しくない行を返します。 Btw、あなたはこのタイプのコードでIEqualityComparerの規約に違反しています。結果は実際には未定義です。 – usr

+1

「契約違反」とは、例えば、再テスト== 0のオブジェクトよりも(例えば)それ自体が不等と比較されることを意味します。 – usr

関連する問題