gpt4 book ai didi

c# - 嵌套对象上的 EqualityComparer

转载 作者:行者123 更新时间:2023-11-30 20:25:18 25 4
gpt4 key购买 nike

我想比较两个嵌套对象列表。如果父对象 Id 不同和/或任何子对象 IdBaz 属性不同,我想认为它们已更改。

我已经在下面实现了我自己版本的 EqualsGetHashCode,但是尽管使用了我自己的 equalscomparer,Except() 仍然会产生一个结果,而我希望对象是相等的。

var foo1 = new Foo
{
Id = 1,
Bars = new List<Bar>
{
new Bar
{
Id = 1,
Baz = 1.5
},
new Bar
{
Id = 1,
Baz = 1.5
}
}
};

var foo2 = new Foo
{
Id = 1,
Bars = new List<Bar>
{
new Bar
{
Id = 1,
Baz = 1.5
},
new Bar
{
Id = 1,
Baz = 1.5
}
}
};

var diff = new[] { foo1 }.Except(new[] { foo2 });
public class Foo
{
private sealed class IdBarsEqualityComparer : IEqualityComparer<Foo>
{
public bool Equals(Foo x, Foo y)
{
if (ReferenceEquals(x, y)) return true;
if (ReferenceEquals(x, null)) return false;
if (ReferenceEquals(y, null)) return false;
if (x.GetType() != y.GetType()) return false;
return x.Id == y.Id && Equals(x.Bars, y.Bars);
}

public int GetHashCode(Foo obj)
{
unchecked
{
return (obj.Id * 397) ^ (obj.Bars != null ? obj.Bars.GetHashCode() : 0);
}
}
}

public static IEqualityComparer<Foo> IdBarsComparer { get; } = new IdBarsEqualityComparer();

public int Id { get; set; }
public List<Bar> Bars { get; set; }
}

public class Bar
{
protected bool Equals(Bar other)
{
return Id == other.Id && Baz.Equals(other.Baz);
}

public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((Bar) obj);
}

public override int GetHashCode()
{
unchecked
{
return (Id * 397) ^ Baz.GetHashCode();
}
}

public int Id { get; set; }
public double Baz { get; set; }
}

最佳答案

您的代码中有三处错误:

  1. 您没有将相等比较器传递给 Except 方法,因此未使用它。
  2. 您在 Foo 中的 GetHashCode 实现是错误的,它对相同对象返回不同的结果,因此永远不会调用 Equals 方法。<
  3. 您正在两个列表上调用 equals:Equals(x.Bars, y.Bars),这会检查引用是否相等。您可以使用 SequenceEqual 来逐一比较元素:x.Bars.SequenceEqual(y.Bars)

关于c# - 嵌套对象上的 EqualityComparer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52027492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com