【问题标题】:Can I test two ArrayList (C#) instances for value equality?我可以测试两个 ArrayList (C#) 实例的值相等性吗?
【发布时间】:2013-08-05 10:06:17
【问题描述】:

我写了一个小的帮助方法contentsToArrayList。如果我将一个实现 ICollection 的对象传递给它,它会返回一个 ArrayList,其中包含与原始对象相同的元素。如果我将另一个对象传递给它,它会返回一个包含对象本身的 ArrayList。

现在我想测试这个方法。我的单元测试看起来像这样(有点缩写,我包含了更多的测试用例):

        //Arrange
        int a = 1;
        ArrayList aAsArrayList = new ArrayList();
        aAsArrayList.Add(a);
        List<int> f = new List<int>() { 4, 5, 6 };
        ArrayList fAsArrayList = new ArrayList(f);

        //Act
        ArrayList aReturned = contentsToArrayList(a);
        ArrayList fReturned = contentsToArrayList(f); 

现在我不确定如何编写我的断言。基本上,我想确保 aAsArrayList 包含与 aReturned 相同的对象。但是 ArrayList 是一个引用类型,我不确定它是否定义了值相等。我可以使用 aReturned == aAsArrayList 之类的方法轻松比较数组列表,还是必须比较数组列表的每个成员?

【问题讨论】:

  • 你在使用 nunit 吗?如果是这样,请使用 CollectionAssert nunit.org/index.php?p=collectionAssert&r=2.4
  • @doctorlove 不,我正在使用 Visual Studio 中的内置测试框架。但感谢您提供 nunit 解决方案。
  • 尽可能避免使用 ArrayList。只是说...

标签: c# collections equality


【解决方案1】:

我不确定它是否定义了值相等。

你是对的,它没有定义值相等。

比较 ArrayList 对象是否相等的一种方法是使用 LINQ:

if (aReturned.Cast<object>().SequenceEqual(fReturned.Cast<object>())) {
    ...
}

转换为object 是最“宽容”的——它们不会在您的测试中触发转换异常。如果您知道两个数组都包含int 类型的值,则可以将Cast&lt;object&gt;() 中的类型替换为Cast&lt;int&gt;()

【讨论】:

  • 谢谢。 SequenceEqual 方法是我想到的那种解决方案,但不知道它是否存在。
【解决方案2】:

关于 C# 规范的类似问题

List<T> operator == In the C# Language Specification Version 4 在 StackOverflow 上

暗示这个问题的答案是否定的

另外页面

MSDN 上的ArrayList

表明 ArrayList 对象没有覆盖 == 运算符

因此,您可能会编写一个辅助方法来检查一个数组的每个元素是否包含在另一个数组中。如果这对两个 ArrayList 都是正确的,那么它们在您希望的方式上是相等的。类似的东西

public bool ArrayListsEqual(ArrayList a, ArrayList b) {
    foreach (obj A in a) {
        if (!b.Contains(A)) {
            return false;
        }
    }
    foreach (obj B in b) {
        if (!a.Contains(B)) {
            return false;
        }
    }
    return true;
}

【讨论】:

  • 仅供参考 == 不是一种方法,它是 operator 并且您的 ArrayListsEqual 效率低下 (O(n1) * O(n2)) * 2
  • 当然是低效的。在编写测试助手方法时,优先考虑的是逻辑合理且清晰,因此最终不需要为自己的测试编写测试。
  • 是的,但是当框架提供了一个高效的SequenceEqual时,为什么要打破我们的头脑。
  • 另外,我相信 Sequence equal 检查项目的顺序是否相同,这(从问题中)似乎不是必需的行为。
  • 是的,你是对的。在这种情况下,您可以对两个列表进行排序并使用SequenceEqual 不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多