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
私は、retest == 0のアイテムは、等価ステートメントの条件でretest == 1が必要なときに返されます。 – static416
条件がfalseの場合、オブジェクトはあたかも等しくない。 Distinctは等しくない行を返します。 Btw、あなたはこのタイプのコードでIEqualityComparerの規約に違反しています。結果は実際には未定義です。 – usr
「契約違反」とは、例えば、再テスト== 0のオブジェクトよりも(例えば)それ自体が不等と比較されることを意味します。 – usr