C# 在单元测试中比较两个ArrayList
我编写了一个单元测试,我想比较两个C# 在单元测试中比较两个ArrayList,c#,unit-testing,arraylist,C#,Unit Testing,Arraylist,我编写了一个单元测试,我想比较两个数组列表。 我确信这两份名单是相等的,考试应该通过,但他没有 我将它们作如下比较: CollectionAssert.AreEqual(expected, actual) 预期的和实际的是这两个数组列表 是否可以像我上面所写的那样比较两个数组列表?这里的问题是CollectionAssert.AreEqual()将使用Equals()比较元素 对于不重写Equals()的引用类型,将进行引用比较。这不是你想要的 幸运的是,您可以解决这个问题,因为 因此,您所需
数组列表
。
我确信这两份名单是相等的,考试应该通过,但他没有
我将它们作如下比较:
CollectionAssert.AreEqual(expected, actual)
预期的
和实际的
是这两个数组列表
是否可以像我上面所写的那样比较两个
数组列表?这里的问题是CollectionAssert.AreEqual()
将使用Equals()
比较元素
对于不重写Equals()
的引用类型,将进行引用比较。这不是你想要的
幸运的是,您可以解决这个问题,因为
因此,您所需要做的就是创建一个比较器,如果两个元素相等,则返回零;如果两个元素不相等,则返回非零。这有点复杂,因为ArrayList
存储对象,所以需要转换到正确的类型进行比较
(注意,这有点滥用IComparer
,因为它是
应该返回-ve、0或+ve以提供
左侧和右侧。但是,CollectionAssert.AreEqual()
只用于测试平等性,所以我们返回就足够了
在我们的实现中为零或非零
AreEqual()
方法最好使用
比较元素,但我认为postdate是相等的()
在编写AreEqual()
时不可用。)
假设元素的类型为string[]
(您说它们是),则可以创建比较器来比较元素,如下所示:
var comparer = Comparer<object>.Create((a, b) => ((string[]) a).SequenceEqual((string[]) b) ? 0 : 1);
此断言将成功,但为了证明这将检测差异,请将最后一个list2.Add()
更改为list2.Add(Enumerable.Range(20,9).Select(n=>n.ToString()).ToArray())代码>和断言将失败。列表包含哪些内容?在没有看到任何数据的情况下,很难猜测为什么比较失败。无论如何,还有一个CollectionAssert.arequivalent
,它将检查列表是否包含相同的元素,而不考虑它们的顺序。可能它们具有相同的值,但它们不是相同的实例。这就是你考试失败的原因我guess@HimBromBeere列表中包含字符串数组“是否可以像我上面写的那样比较两个ArrayList?”当然,与您描述的方式完全相同。但是,如果不查看列表,就不可能看到比较失败的原因。在您的特定情况下,这是正确的,因为您只是在比较字符串。如果我想在程序中编写比较器,则会出现a)错误。SequenceEqual
该系统。数组不包含“SequenceEqual”定义?@PascalHurniSequenceEqual()
来自Linq-您是否使用System.Linq代码>在你的程序文件开始时?你听说了很多关于Linq的事情,但不知道它是什么,但这就是问题所在,谢谢!现在通过的测试将接受您的anwser!
ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();
list1.Add(Enumerable.Range( 0, 10).Select(n => n.ToString()).ToArray());
list1.Add(Enumerable.Range(10, 10).Select(n => n.ToString()).ToArray());
list1.Add(Enumerable.Range(20, 10).Select(n => n.ToString()).ToArray());
list2.Add(Enumerable.Range( 0, 10).Select(n => n.ToString()).ToArray());
list2.Add(Enumerable.Range(10, 10).Select(n => n.ToString()).ToArray());
list2.Add(Enumerable.Range(20, 10).Select(n => n.ToString()).ToArray());
var comparer = Comparer<object>.Create((a, b) => ((string[]) a).SequenceEqual((string[]) b) ? 0 : 1);
CollectionAssert.AreEqual(list1, list2, comparer);