我试图用FluentAssertions比较两个对象列表。这些对象的属性存储为可能会少量偏离的双精度型。有没有一种有效的方法可以执行此操作而无需遍历列表?我目前的方法看起来像

actualList.ShouldAllBeEquivalentTo(expectedList, options => options.Excluding(o => o.DoubleProperty));

for (var i = 0; i < actualList.Count; i++)
{
    actualList[i].DoubleProperty
                 .Should().BeApproximately(expectedList[i].DoubleProperty, precision);
}


随着这个问题的不断出现,这有点丑陋和令人不快。另一种可能性(受Fluent Assertions: Compare two numeric collections approximately启发)是

actualList.Select(o => o.DoubleProperty)
          .Should().Equal(expectedList.Select(o => o.DoubleProperty),
                          (left, right) => AreEqualApproximately(left, right, precision));


我自己写AreEqualApproximately函数的地方。如果可能的话,我想做比较而不定义自己的辅助方法或按索引遍历列表。

最佳答案

以下内容也应使用ShouldAllBeEquivalentTo中可用的选项工作

actualList.ShouldAllBeEquivalentTo(expectedList, options => options
    .Using<double>(ctx => ctx.Subject.Should()
                             .BeApproximately(ctx.Expectation, precision))
    .When(o => o.SelectedMemberPath == "DoubleProperty"));

09-12 06:58