0

同样使用带有专门用于比较列表的方法的断言库,我无法在单元测试中匹配这两个结果:

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使用支持列表比较的方法进行匹配。

有没有办法不做?

4

1 回答 1

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,两个组件相互检查以确定Tuples 是否相等。因为第二个是使用Array标准引用相等比较器。并且因为您Tuple的 s 没有指向Array内存中的相同内容,所以它返回 false。

如果您的对象仅指向同一个数组,则Stardard.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也一样。

于 2013-03-28T06:45:47.017 回答