所以这是我第一次尝试使用 IEqualityComparer 并且遇到了问题。
很可能我只是不明白代码在幕后做什么。
我提供的列表如下所示:
Test Run | SN | Retest
1 185 0
2 185 1
3 185 1
4 185 1
我正在尝试使用 Distinct() 来查找具有唯一 SN 和 'retest==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;
}
}
问题是这似乎产生了一个包含前两个项目的列表,而我正在寻找的是一个列表,其中只包含一个“retest == 1”的项目。
知道我在这里做错了什么吗?'retest == 0' 的记录是如何返回的?
回答
如果条件为假,则将对象视为不相等。Distinct 返回不相等的行。顺便说一句,您使用这种类型的代码违反了 IEqualityComparer 的合同。结果实际上是不确定的。- 用户
对于“违反合同”,我的意思是(例如)具有 retest==0 的对象将与自身比较不相等。- 用户