0

所以这是我第一次尝试使用 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 的对象将与自身比较不相等。- 用户

4

1 回答 1

1

您需要过滤掉 retest = 0 的项目。将 .Where(x => x.retest != 0) 放在 Distinct 前面。

于 2012-04-25T18:41:01.173 回答