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”定义?@PascalHurni
SequenceEqual()
来自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);