【问题标题】:How do I compare a list of dictionaries for equality in C#如何在 C# 中比较字典列表是否相等
【发布时间】:2013-10-09 18:27:45
【问题描述】:

我正在尝试比较类型为 IEnumerable<IDictionary<string, object>> 的 2 个对象 expectedItemsresultItems,但没有做太多事情。

此外,一个字典在代码中初始化,另一个字典是从外部 API 的 JSON 响应构建的。由于 JSON 并不真正关心对象内属性的顺序,因此排除了 SequenceEquals

我确实有两个相等的对象,但所有这些低调的方法都失败了,
首先,

CollectionAssert.AreEqual(expectedItems, resultItems)

第二,

var expectedItems = entries.Select(e => e.Serialize()).ToList();
resultItems.Zip(expectedItems,(objects, dictionary) => 
objects.OrderBy(pair =>pair.Key).SequenceEqual(dictionary.OrderBy(pair => pair.Key)))
                                   .Should()
                                   .NotContain(false);

对象(据我所知)是相等的。

我可以尝试什么,或者我目前做错了什么?

编辑
API 会从时间戳中剔除滴答计数,这就是失败的原因。 如何修剪 expectedItems 字典中的时间戳,然后进行比较?因此,集合必须相同,并且需要覆盖时间戳的比较。有人吗?

【问题讨论】:

    标签: c# dictionary fluent-assertions


    【解决方案1】:

    要检查两件事:

    1. 对象是否预先实现了Equals() 方法?如果不相等,只需检查引用,因为它们是两个不同的实例,它们看起来是不同的。 另一种选择可能是,因为您的对象代表时间戳,正如我从图片中猜测的那样。
    2. 即使它正确实现了 Equals,即使就毫秒(如果存在)部分而言,对象是否相同?

    【讨论】:

    • 是的,我进一步检查了,它是在往返过程中被修剪的 InternalTicks 计数。知道我该如何应对吗?
    • 所以检查是否定义了 Equals (pt 1)
    【解决方案2】:

    你为什么不安装 FluentAssertions 并做这样的事情?

    resultsItem.ShouldAllBeEquivalentTo(expectedItems);

    我不知道 DateTime 比较的限制有多大,但您可以轻松地override 特定属性的行为。

    【讨论】:

    • 我安装了流利的断言。将检查此方法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-09-14
    • 2013-03-29
    • 2012-05-11
    • 1970-01-01
    • 2012-10-03
    • 2010-12-10
    • 1970-01-01
    相关资源
    最近更新 更多