我曾经比较这样的列表,但它在测试中返回false:
Assert.IsTrue(expected.SequenceEquals(actual));
尝试转换为json并且有效:
Assert.AreEqual(expected.ToJson(), actual.ToJson());
价值似乎是平等的,可能会有什么不同?如何找出列表中的不同之处?
已更新:
我的课程:
public class Department
{
[BsonId]
public ObjectId Id { get; set; }
public string Name { get; set; }
public override string ToString()
{
return Id.ToString();
}
}
答案 0 :(得分:5)
如果MyClass
实施IEquatable<MyClass>
,请尝试以下操作:
expected.Sort();
actual.Sort();
if (Enumerable.SequenceEqual(actual, expected)) { ... }
如果它没有实现IEquatable
那么你会发现奇怪的行为,因为对象引用将在两个列表中进行比较,而不是它们的字段:
using System;
using System.Collections.Generic;
using System.Linq;
public class MyClassA
{
private int i;
public MyClassA(int i) { this.i = i; }
}
public class MyClassB : IEquatable<MyClassB>
{
private int i;
public MyClassB(int i) { this.i = i; }
public bool Equals(MyClassB other) { return this.i == other.i; }
}
public class Program
{
public static void Main()
{
var actual1 = new List<MyClassA>() { new MyClassA(1), new MyClassA(2), new MyClassA(3) };
var expected1 = new List<MyClassA>() { new MyClassA(1), new MyClassA(2), new MyClassA(3) };
Console.WriteLine(Enumerable.SequenceEqual(actual1, expected1));
var a1 = new MyClassA(1);
var a2 = new MyClassA(2);
var a3 = new MyClassA(3);
var actual2 = new List<MyClassA>() { a1, a2, a3 };
var expected2 = new List<MyClassA>() { a1, a2, a3 };
Console.WriteLine(Enumerable.SequenceEqual(actual2, expected2));
var actual3 = new List<MyClassB>() { new MyClassB(1), new MyClassB(2), new MyClassB(3) };
var expected3 = new List<MyClassB>() { new MyClassB(1), new MyClassB(2), new MyClassB(3) };
Console.WriteLine(Enumerable.SequenceEqual(actual3, expected3));
var actual4 = new List<MyClassB>() { new MyClassB(1), new MyClassB(2), new MyClassB(3) };
var expected4 = new List<MyClassB>() { new MyClassB(3), new MyClassB(2), new MyClassB(1) };
Console.WriteLine(Enumerable.SequenceEqual(actual4, expected4));
}
}
输出:
False
True
True
False
答案 1 :(得分:3)
using System.Linq;
Enumerable.SequenceEqual(a, b);
// or SequenceEqual(a, b, StringComparer.OrdinalIgnoreCase)
请参阅MSDN,同时this question。
答案 2 :(得分:0)
也许你可以使用IEnumerable.ExceptOf
http://msdn.microsoft.com/en-us/library/bb300779.aspx
我们也许您可以使用HashSet并使用intersect方法。 http://msdn.microsoft.com/en-us/library/bb293080.aspx
答案 3 :(得分:0)
我倾向于找到适合此类目的的HashSet<T>
集合,将您的集合投放到HashSet<T>
然后调用SetEquals