C# 比较具有不同项目类型的集合
我有两个具有不同项目类型的集合,例如:C# 比较具有不同项目类型的集合,c#,.net,unit-testing,bdd,fluent-assertions,C#,.net,Unit Testing,Bdd,Fluent Assertions,我有两个具有不同项目类型的集合,例如: var collection1 = new List<Type1>(); var collection2 = new List<Type2>(); 针对我的情况,使用此方法的一个可能解决方案是基于collection2中的项目创建一个新的列表集合,并使用它代替上面示例中的客户。 但有时这是不可能的,而且实际上闻起来像是一种开销 我想知道是否有一种类似的方法可以像上面那样使用FA优雅,但适用于不同项目类型的集合 更新1(尝试使用@D
var collection1 = new List<Type1>();
var collection2 = new List<Type2>();
针对我的情况,使用此方法的一个可能解决方案是基于collection2
中的项目创建一个新的列表
集合,并使用它代替上面示例中的客户
。但有时这是不可能的,而且实际上闻起来像是一种开销 我想知道是否有一种类似的方法可以像上面那样使用FA优雅,但适用于不同项目类型的集合 更新1(尝试使用@DennisDoomen建议): 让我们举一个更具体的例子。
假设我们有一个表示单个月日期的预期值的
列表
:
var expectation = new List<DateTime>();
(但没有排序限制,我不知道如何在本例中演示)
我正试图用@DennisDoomen的建议:
actual.ShouldBeEquivalentTo(
expectation,
options => options.Using<int>(
ctx => ctx.Subject.Should().Be(ctx.Expectation.Day)).WhenTypeIs<int>());
actual.com应与(
期待,,
选项=>选项。使用(
ctx=>ctx.Subject.Should().Be(ctx.Expectation.Day)).WhenTypeIs();
问题是ctx.Expectation
这里是int
的一种类型,而不是DateTime
,因此我无论如何都无法获取DateTime.Day
我在这里遗漏了什么?
应该是等效的,这是您所需要的。默认情况下,它将确保每个集合包含在任何顺序上结构等效的项。然后,您可以使用使用/When
选项定义如何比较类型1
和类型2
。比如:
collection1.ShouldBeEquivalentTo(collection2, options => options
.Using<Type1>(t1 => ctx.Subject.Should().Be(ctx.Expectation)
.WhenTypeIs<Type1>();
collection1.应与之等效(collection2,options=>options
.Using(t1=>ctx.Subject.Should().Be(ctx.expection)
.WhenTypeIs();
谢谢你的回复,@DennisDoomen!在使用了你的建议后,我用一个新问题更新了我的问题。对不起,我从来没有说过应该等同于
,这是你的建议。我从问题一开始的意思(甚至是粗体)正在使用我自己的相等比较器定义两种不同项目类型之间的自定义相等规则。作为最接近的示例,我已经指出.Should().Equal(客户,(c1,c2)=>c1.Name==c2.Name)
允许使用自定义谓词进行相等性检查。因此,我的更新不是一个新问题,它只是一个更具体的示例来阐明我的观点。不过,我很高兴并感谢您的回答:)那么有没有一种方法可以解决我在FA中的情况呢?不,没有。你可以实现一个自定义的IAssertionRule
,并在调用时将其添加到选项中,但是应该是等效的
,但这需要更多的工作。
Assert.AreEqual(expectation[0].Day, actual[0]);
Assert.AreEqual(expectation[1].Day, actual[1]);
...
Assert.AreEqual(expectation[expectation.Count - 1].Day, actual[actual.Count - 1]);
actual.ShouldBeEquivalentTo(
expectation,
options => options.Using<int>(
ctx => ctx.Subject.Should().Be(ctx.Expectation.Day)).WhenTypeIs<int>());
collection1.ShouldBeEquivalentTo(collection2, options => options
.Using<Type1>(t1 => ctx.Subject.Should().Be(ctx.Expectation)
.WhenTypeIs<Type1>();