同样使用断言库和专门用于比较列表的方法,我无法在单元测试中匹配这两个结果:
var list1 = new List<Tuple<string, IEnumerable<string>>>
{
Tuple.Create<string,IEnumerable<string>>("string", new[] { "value" })
};
var list2 = new List<Tuple<string, IEnumerable<string>>>
{
Tuple.Create<string,IEnumerable<string>>("string", new[] { "value" })
};
var result = list1.All(a => list2.Any(a.Equals)); // result false
获得肯定匹配的唯一方法是分解元组并将Item2
与支持列表比较的方法匹配。
有没有办法没有这样做?
答案 0 :(得分:3)
您可以使用SequenceEqual
扩展方法:
var result = list1.All(a => list2.Any(x => x.Item1 == a.Item1 && x.Item2.SequenceEqual(a.Item2)));
为您的示例输入返回true
。
您必须明确地执行此操作并且在比较两个Tuple<string, IEnumerable<string>>
实例时默认情况下不工作的原因是第二个Tuple
项。根据MSDN,两个组件相互重新检查以确定Tuple
s是否相等。因为第二个是Array
标准引用,所以使用了相等比较器。并且因为你的Tuple
没有指向内存中的相同Array
,所以它返回false。
仅当您的.Any(a.Equals)
个对象指向同一个数组时,标准Tuple
才有效:
var array = new[] { "value" };
var list1 = new List<Tuple<string, IEnumerable<string>>>
{
Tuple.Create<string,IEnumerable<string>>("string", array)
};
var list2 = new List<Tuple<string, IEnumerable<string>>>
{
Tuple.Create<string,IEnumerable<string>>("string", array)
};
var result = list1.All(a => list2.Any(a.Equals));
同样返回true
。