我有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来运行它。
答案 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();
}
}