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.
如果订单很重要:
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)