【发布时间】:2018-02-26 09:53:42
【问题描述】:
我正在尝试创建一个比较两个字符串数组列表的单元测试。
我尝试创建两个完全相同的List<string[]> 对象,但是当我使用CollectionAssert.AreEqual(expected, actual); 时,测试失败:
[TestMethod]
public void TestList()
{
List<string[]> expected = new List<string[]> {
new string[] { "John", "Smith", "200" },
new string[] { "John", "Doe", "-100" }
};
List<string[]> actual = new List<string[]> {
new string[] { "John", "Smith", "200" },
new string[] { "John", "Doe", "-100" }
};
CollectionAssert.AreEqual(expected, actual);
}
我也试过Assert.IsTrue(expected.SequenceEqual(actual));,但也失败了。
如果我比较两个字符串列表或两个字符串数组,这两种方法都有效,但在比较两个字符串数组列表时它们不起作用。
我假设这些方法失败了,因为它们正在比较两个对象引用列表而不是数组字符串值。
如何比较两个List<string[]> 对象并判断它们是否真的相同?
【问题讨论】:
-
试试这个:
expected.Zip(actual, (e, a) => e.SequenceEqual(a)).All(x => x). -
出于好奇...如果列表具有相同的元素但顺序不同,您会认为它们“相等”吗?此外,值得注意的是,字符串数组是对象的糟糕替代品。
-
@David 对于这个特定的测试,我可以接受要求元素顺序相同的解决方案,以及忽略顺序的解决方案。我同意对象通常比字符串数组更好。此代码是大图的一部分,需要采用这种格式。
-
@JeppeStigNielsen -
.Zip没有比较完整的长度。 -
.Contains(false)negated 并不比.All(x => x)更有效(也不会更低)。两者都“使用”源,直到找到false的条目。第一个将每个元素与false与bool的默认相等比较器进行比较。第二个调用委托predicate,它包装了来自lambda箭头x => x的静态IL方法,并检查返回值。由于运行时在任何一种情况下都会进行内联,我认为两者都会同样快(我没有测量)。同意@Enigmativity。
标签: c# arrays list unit-testing equality