c# - 比较两个 List<MyClass> : How to find out difference?

标签 c# .net unit-testing mstest mongodb-.net-driver

我曾经像这样比较列表,但它在测试中返回 false:

Assert.IsTrue(expected.SequenceEquals(actual));

并尝试转换为 json 并且成功了:

Assert.AreEqual(expected.ToJson(), actual.ToJson());

值(value)观似乎是平等的,有什么不同?如何找出列表中的不同之处?

更新:

我的类(class):

public class Department
{
    [BsonId]
    public ObjectId Id { get; set; }    
    public string Name { get; set; }            

    public override string ToString()
    {
        return Id.ToString();
    }
}

最佳答案

如果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

关于c# - 比较两个 List<MyClass> : How to find out difference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8415602/

相关文章:

c# - 通过遍历列表创建新的 StringBuilder,删除最后一个元素

ios - 何时需要将应用程序源包含在测试目标中?

c# - 测试失败后如何执行代码

c# - 有没有办法为已编译的绑定(bind)获取 UpdateSourceTrigger=PropertyChanged?

c# - 不能使用二级派生类作为通用基类类型的参数

c# - 来自数据源的 String 类型的给定值无法转换为指定目标列的 float 类型

.net - 当我们对子列表应用条件时,如何过滤父列表<>?

c# - 来自客户端的 SignalR 多个并发调用

.net - 如何将 NLog 的文件名设置为进程开始日期?

javascript - AngularJS : testing a factory that returns a promise, 在模拟使用 $http 的服务时