【问题标题】:Using IEqualityComparer to check specific values使用 IEqualityComparer 检查特定值
【发布时间】:2012-04-25 18:37:50
【问题描述】:

所以这是我第一次尝试使用 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 的合同。结果实际上是不确定的。 – usr

对于“违反合同”,我的意思是(例如)具有 retest==0 的对象将与自身比较不相等。 – usr

【问题讨论】:

    标签: linq list c#-4.0 distinct iequalitycomparer


    【解决方案1】:

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

    【讨论】:

    • 我想知道的是,当相等语句的条件要求 retest == 1 时,为什么会返回 retest == 0 的项目。
    • 如果条件为假,则将对象视为不相等。 Distinct 返回不相等的行。顺便说一句,您使用这种类型的代码违反了 IEqualityComparer 的合同。结果实际上是未定义的。
    • 对于“违反合同”,我的意思是(例如)一个具有 retest==0 的对象将与自身比较不相等。
    • 嗯,好的。那讲得通。看起来像使用一个 .Where 之后,一个更简单的 IEqualityComparer 只是给我独特的 SN 就可以完成这项工作。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多