断言两个List <List <T >>相互等效

Gra*_*ton 16 c# nunit

为了确保两个列表相同,在nunit中,我们可以CollectionAssert.AreEquivalent用来检查这两个列表是否包含相同的元素(命令不重要).

但是如何检查两者List<List<T>>是否相同?这个想法是,如果一个List<T>元素与另一个元素具有相同的元素List<T>(再次,顺序并不重要),那么它们是相等的.

Jon*_*nna 5

你必须循环遍历它们以确保它们是等效的,但有一些重要的快捷方式:

  1. 如果它们实际上是同一个实例(并且在实际代码中经常会出现这种情况),那么ReferenceEquals(x, y)它将返回true.否则它不会.如果ReferenceEquals返回true,则它们是等效的.

  2. 如果一个是空的而另一个不是,那么显然它们是不相等的(如果它们都是空的,你就会抓住上面的那个ReferenceEquals).为了安全起见,你还需要测试null,所以在许多情况下你还有另一个捷径.

  3. 如果它们具有不同的大小(对于大多数等价定义,则存在例外)它们不相等.立即返回false.

  4. 在您发现不匹配的那一刻,您可以在不继续检查的情况下返回false.

  5. 如果它们已经排序,那么比较它们会更快.如果您可以对它们进行排序,或者无法跟踪它们是否已排序,然后仅在需要时进行排序,则可以大大加快速度.(注意尽管许多排序算法在不必要地排序已经排序的列表时会出现更糟糕的行为).


Nic*_*s78 0

我认为您无法单独检查每个元素。我通常会首先检查长度是否相等,然后在列表的长度上循环 i 并检查 list1[i]==list2[i]

更新

抱歉,错过了关于元素不必按顺序排列的(中心)部分。在这种情况下,使用第二个列表的元素创建一个 HashSet,并检查 list1 中的每个元素是否在哈希集中。这减少了从线性查找到对数查找的运行时间。

更新 2 正如 Donald Ray 所指出的,如果任何列表中可能多次出现单个对象,则必须检查两种方法。