【问题标题】:Test equality of two lists测试两个列表的相等性
【发布时间】:2020-03-06 09:11:36
【问题描述】:

我必须检查两个列表的相等性,包括它们的元素以及它们的序列。我正在使用以下,但它不起作用

    public class SampleClass
    {
        public string Id { get; set; }
        public string Name { get; set; }
    }

    [TestMethod]
    public void EqualityTest()
    {
        var list1 = new List<SampleClass>
        {
            new SampleClass {Id  = "11", Name = "abc"},
            new SampleClass {Id  = "22", Name = "xyz"}
        };
        var list2 = new List<SampleClass>
        {
            new SampleClass {Id  = "11", Name = "abc"},
            new SampleClass {Id  = "22", Name = "xyz"}
        };
        Assert.IsTrue(Enumerable.SequenceEqual(list1, list2));
    }

请提出任何解决方案。

【问题讨论】:

  • 你可以实现IEquatable
  • 默认情况下,比较将通过object.ReferenceEqual() 完成,因为SampleClass 类型没有实现IEquatable&lt;SampleClass&gt;。您可以通过使SampleClass 实现IEquatable&lt;SampleClass&gt; 或使用接受合适IEqualityComparer&lt;SampleClass&gt;SequenceEqual 的重载来解决此问题。
  • 抱歉,它不起作用并显示错误“CollectionAssert.AreEqual failed.(索引 0 处的元素不匹配。)”
  • 因为它默认只比较references。你必须提供一些方法来比较你的类的两个实例,要么提供IEqualityComparer,要么让你的类实现IEquatable&lt;SampleClass&gt;。仅仅因为SampleClass 的两个实例共享相同的属性,并不意味着它们是相等的。

标签: c# list testing


【解决方案1】:

由于您没有覆盖 Equals 或实现 IEquatable&lt;SampleClass&gt;,您只是获得了默认比较,它检查引用是否相等。

你想要这样的东西:

public class SampleClass : IEquatable<SampleClass>
{
    public string Id { get; set; }
    public string Name { get; set; }

    public bool Equals(SampleClass obj)
    {
      if(obj == null) return false;

      return obj.Id == this.Id && obj.Name == this.Name
    }

    public override bool Equals(object obj) => Equals(obj as SampleClass);
}

【讨论】:

    【解决方案2】:

    我建议使用深度比较库,例如 Compare-Net-Objects

    只需导入 NuGet 包

    Install-Package CompareNETObjects
    

    并调用辅助方法

    list1.ShouldCompare(list2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多