比较两个List <string>是否相等

Ada*_*ane 60 .net c# collections comparison equality

除了单独逐步执行元素之外,如何比较两个字符串列表是否相等(在.NET 3.0中):

这失败了:

// Expected result.
List<string> expected = new List<string>();
expected.Add( "a" );
expected.Add( "b" );
expected.Add( "c" );

// Actual result
actual = new List<string>();
actual.Add( "a" );
actual.Add( "b" );
actual.Add( "c" );

// Verdict
Assert.IsTrue( actual == expected );
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 76

请尝试以下方法

var equal = expected.SequenceEqual(actual);
Run Code Online (Sandbox Code Playgroud)

测试版

Assert.IsTrue( actual.SequenceEqual(expected) );
Run Code Online (Sandbox Code Playgroud)

SequenceEqual扩展方法将比较集合的元素以保持相等.

请参阅http://msdn.microsoft.com/en-us/library/bb348567(v=vs.100).aspx


dah*_*byk 41

许多测试框架都提供了CollectionAssert类:

CollectionAssert.AreEqual(expected, actual);
Run Code Online (Sandbox Code Playgroud)

例如MS测试


And*_*hin 12

您始终可以自己编写所需的功能:

public static bool ListEquals<T>(IList<T> list1, IList<T> list2) {
    if (list1.Count != list2.Count)
        return false;
    for (int i = 0; i < list1.Count; i++)
        if (!list1[i].Equals(list2[i]))
            return false;
    return true;
}
Run Code Online (Sandbox Code Playgroud)

并使用它:

// Expected result.
List<string> expected = new List<string>();
expected.Add( "a" );
expected.Add( "b" );
expected.Add( "c" );

// Actual result
actual = new List<string>();
actual.Add( "a" );
actual.Add( "b" );
actual.Add( "c" );

// Verdict
Assert.IsTrue( ListEquals(actual, expected) );
Run Code Online (Sandbox Code Playgroud)


bob*_*mcr 10

我注意到没有人告诉你为什么你的原始代码不起作用.这是因为==运算符通常测试引用相等性(即,如果两个实例指向内存中的同一对象),除非运算符已经过. List<T>没有定义==运算符,因此使用了基本引用等于实现.

正如其他海报所展示的那样,你通常必须逐步通过元素来测试"集合平等".当然,您应该使用用户DreamWalker建议的优化,该优化在逐步测试之前首先测试集合的Count.


Gau*_*aui 7

如果订单很重要:

bool equal = a.SequenceEquals(b);
Run Code Online (Sandbox Code Playgroud)

如果订单无关紧要:

bool equal = a.Count == b.Count && new HashSet<string>(a).SetEquals(b);
Run Code Online (Sandbox Code Playgroud)