gpt4 book ai didi

c# - 在 C# 中,如何获得嵌套匿名数组和对象的递归值相等性?

转载 作者:太空狗 更新时间:2023-10-29 20:29:48 24 4
gpt4 key购买 nike

注意:对于Assert,使用Xunit

匿名对象使用值相等:

Assert.Equal(
new { foo = "bar" },
new { foo = "bar" }
);

匿名对象的匿名数组使用值相等:

Assert.Equal(
new [] { new { foo = "bar" } },
new [] { new { foo = "bar" } }
);

带有嵌套数组的匿名对象似乎使用了引用相等性(这失败了):

Assert.Equal(
new { baz = new [] { new { foo = "bar" } },
new { baz = new [] { new { foo = "bar" } }
);

但这行得通(大概是因为现在引用相等):

var baz = new [] { new { foo = "bar" } };
Assert.Equal(
new { baz },
new { baz }
);

这是有效的(所以看起来我可以递归地嵌套匿名对象并保留值相等):

Assert.Equal(
new { baz = new { qux = new { foo = "bar" } } },
new { baz = new { qux = new { foo = "bar" } } }
);

我不确定这里如何进行相等,但我希望能够嵌套对象和数组并具有无限深度的值相等。我该怎么做呢?

更新

看起来像Fluent Assertions解决了我的问题(此测试通过):

(new { baz = new[] { new { foo = "bar" } } })
.Should()
.BeEquivalentTo(new { baz = new [] { new { foo = "bar" } } });

最佳答案

对于匿名类型,它们的 EqualGetHashCode 实现是递归运行 EqualGetHashCode 的结果他们的属性(property)。因此,如果您有两个具有相同值的相似值类型属性的匿名类,那么它们比较相等。

但是,如果任何属性是引用类型,并且它不指向同一个对象,那么它们将不相等。

这是来自 Microsoft 文档 [1] 的片段:

Because the Equals and GetHashCode methods on anonymous types are defined in terms of the Equals and GetHashCode methods of the properties, two instances of the same anonymous type are equal only if all their properties are equal.

现在,至于为什么数组相等,我敢打赌是 Assert.Equal 实现检查对象是否可枚举,然后检查它们的项是否相等。

关于c# - 在 C# 中,如何获得嵌套匿名数组和对象的递归值相等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52324635/

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