0

我正在尝试将自定义类型一分为二List<T>并使用Intersect/Except方法。相等性由这种类型的三个字段确定。相等性不仅仅基于普通条件(所有字段都包含相同的数据)。我当然实现了IEqualityComparer<T>. 我的问题是,GetHashCode()一旦 hashCode 不同,方法返回不相等,这对我没有帮助,因为在我的情况下这不是真的。

当相等性基于多个条件时,有什么方法可以比较两个自定义对象,以便我可以使用相交/除外/不同等...?

这是我的代码:

public bool Equals(ComparableObject x, ComparableObject y)
{
    if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
        return false;

    if (Object.ReferenceEquals(x, y))
        return true;

    if (x.Var1.Equals(y.Var1) && x.Var3.Equals(y.Var3) && !x.Var2.Equals(y.Var2))
        return false;

    if (x.Var1.Equals(y.Var1) && !x.Var3.Equals(y.Var3) && !x.Var2.Equals(y.Var2))
        return true;


    if (!x.Var1.Equals(y.Var1) && x.Var3.Equals(y.Var3) && !x.Var2.Equals(y.Var2))
        return false;

    if (!x.Var1.Equals(y.Var1) && x.Var3.Equals(y.Var3) && x.Var2.Equals(y.Var2))
        return true;

    if (x.Var1.Equals(y.Var1) && !x.Var3.Equals(y.Var3) && x.Var2.Equals(y.Var2))
        return false;

    if (!x.Var1.Equals(y.Var1) && !x.Var3.Equals(y.Var3) && x.Var2.Equals(y.Var2))
        return false;

    if (!x.Var1.Equals(y.Var1) && !x.Var3.Equals(y.Var3) && !x.Var2.Equals(y.Var2))
        return false;


    return x.Var1.Equals(y.Var1) && x.Var1.Equals(y.Var1) && x.Var3.Equals(y.Var3);
}


public int GetHashCode(ComparableObject x)
{
    return obj.Var1.GetHashCode() ^ obj.Var2.GetHashCode()^ obj.Var3.GetHashCode()
}
4

2 回答 2

2

您的工作是提供这样GetHashCode()的值:对于不同的对象在尽可能多的情况下;您仍然可以为不相等的对象返回相同的哈希码),并且对于不相等的对象返回的值将始终相同。可能相等(在所有情况下;您可能不会为相等的对象返回不同的哈希码)。

例如,如果您比较的三个字段之一是int,您可以将该字段返回为GetHashCode()

但是,如果很难想出一些聪明的东西,您可以返回一个常数,例如42. Equals()将为所有对象对调用这种方式,以提供预期的结果,尽管是以最低性能的方式。

于 2012-03-09T12:20:28.243 回答
0

不确定您的基础类型中是否存在 GetHashCode 的其他问题,但这是自定义类型和 IEqualityComparer 的示例,如果只有前两个字段相同,则返回 true。这将允许Exceptetc. 处理该类型。

    public class CustomType
    {
        public int Val1 { get; set; }
        public int Val2 { get; set; }
        public int Val3 { get; set; }
    }

    class CustomTypeComparer : IEqualityComparer<CustomType>
    {
        public bool Equals(CustomType x, CustomType y)
        { return x.Val1 == y.Val1 && x.Val2 == y.Val2; }

        public int GetHashCode(CustomType obj)
        { return obj.Val1.GetHashCode() ^ obj.Val2.GetHashCode(); }
    }

如果您的属性不是简单类型如int,您可能希望使用Equals()而不是==比较对象。

于 2012-03-09T12:28:32.657 回答