使两个相互依赖的类相等

时间:2019-12-21 13:29:03

标签: c# .net-core

我有A类:

public class A : IEquatable<A>
{
    public B Owner { get; set; }

    public override bool Equals(object obj)
    {
        return Equals(obj as A);
    }

    public bool Equals([AllowNull] A other)
    {
        return other is A a &&
               EqualityComparer<B>.Default.Equals(Owner, a.Owner);
    }
}

我有B类:

public class B : IEquatable<B>
{
    public List<A> Children { get; set; } = new List<A>();

    public override bool Equals(object obj)
    {
        return Equals(obj as B);
    }

    public bool Equals([AllowNull] B other)
    {
        return other is B b &&
               EqualityComparer<List<A>>.Default.Equals(Children, b.Children);
    }
}

我遇到的问题是使上述类的Equals()方法起作用。示例中的Equals()方法是由VS Code生成的,但是对于B类,总是返回false。

我也尝试过使用LINQ表达式(例如SequenceEqual方法),但它始终会导致堆栈溢出(由于循环依赖?)。

作为旁注,我使用.NET Core 3.0来运行它。

1 个答案:

答案 0 :(得分:0)

因此,我设法找到了问题的答案。我刚刚实现了自己的自定义IEqualityComparer。 (在下面的示例中,我向两个类都添加了public Guid ID属性,以执行正确的GetHashCode())。

public class BComparer : IEqualityComparer<B>
{
    public bool Equals([AllowNull] B x, [AllowNull] B y)
    {
        if (x is null || y is null)  {return false;}

        if (x.ID == y.ID) {
            return x.Children.SequenceEqual(y.Children);
        } else {
            return false;
        }
    }

    public int GetHashCode([DisallowNull] B obj)
    {
        return obj.ID.ToString().GetHashCode();
    }
}