元组结构身份

时间:2013-03-28 06:42:50

标签: c# unit-testing tuples identity

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

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

有没有办法没有这样做?

1 个答案:

答案 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