我可以测试两个ArrayList(C#)实例的值是否相等?

时间:2013-08-05 10:06:17

标签: c# collections equality

我写了一个小帮手方法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是一个引用类型,我不确定它是否定义了值相等。我可以轻松地比较arraylists,使用类似aReturned == aAsArrayList的东西,还是我必须比较arraylist的每个成员?

2 个答案:

答案 0 :(得分:4)

  

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

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

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

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

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

答案 1 :(得分:1)

关于C#规范的类似问题

StackOverflow上的

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

意味着这个问题的答案是否定的

此外页面

MSDN上的

ArrayList

显示ArrayList对象没有覆盖==运算符

因此,您可能会编写一个帮助器方法来检查一个数组的每个元素是否包含在另一个数组中。如果对于两个ArrayLists都是如此,则它们以您希望的方式相同。像

这样的东西
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;
}