检查 2 个对象在字段中是否包含相同的数据

Check if 2 objects contain the same data in fields

提问人:Tatu 提问时间:10/13/2017 更新时间:10/13/2017 访问量:986

问:

我有一个包含许多属性的类,并且通过将属性作为键来声明唯一属性。PharmacyPharmacyID

我有代码,可以将表中的所有行从MySQL提取回具有其属性的对象。Pharmacy

我想比较两个对象中的条目,并检查两个表中是否存在相同的条目,如果不存在,则将其添加到新的 .如果两者中都存在,但对象中的数据不同,则将该对象也保存到新对象。List<Pharmacy>IDList<PharmacyIDList<Pharmacy

这就是班级的样子。

public class Pharmacy
{
    [Key]
    public string Tunniste { get; set; }
    public string Lyhenne { get; set; }
    public string PitkaNimi { get; set; }
    public string YlempiYksikko { get; set; }
    public string Hierarkiataso { get; set; }
    public string VoimassaoloAlkaa { get; set; }
    public string VoimassaoloPaattyy { get; set; }
    ...
}

这是芬兰语,但我希望你能接受它。 以下是我尝试检查它们是否相同的方法。

        for (int i = 0; i != pharmacyListFromArchive.Count; i++)
        {
            if (pharmacyListFromArchive[i].Equals(pharmacyListFromNew[i]))
            {
                Console.WriteLine("Objects are identical.");
            }
            else
            {
                Console.WriteLine("Objects are NOT identical. {0} - {1}", pharmacyListFromArchive[i].Tunniste, pharmacyListFromNew[i].Tunniste);
            }
        }

但是当我运行它时,即使它们在数据上相同,也没有一个对象注册为相同。我该如何解决这个问题?

C# .NET 列表 对象 相等

评论

5赞 Tim Schmelter 10/13/2017
必须重写才能比较 ID 属性,否则仅比较引用Equals
1赞 bartbje 10/13/2017
序列化两个对象并比较生成的字符串,可能是一种选择?

答:

4赞 Georg Patscheider 10/13/2017 #1

检查的标准实现仅针对引用相等性。Equals Method 的默认行为是什么?Equals

您可以覆盖 的行为。重写 equals() 和运算符 == 的准则(C# 编程指南)。Equals

public class Pharmacy  {
   // fields ...

   public override bool Equals(object obj) {
       // If parameter is null return false.
        if (obj == null) {
            return false;
        }

        // If parameter cannot be cast to Pharmacy return false.
        Pharmacy p = obj as Pharmacy;
        if ((System.Object)p == null) {
            return false;
        }

        // Return true if the fields match:
        return p.Lyhenne == this.Lyhenne &&
               p.PitkaNimi == this.PitkaNimi
               // && etc...
        ;
   }

    public override int GetHashCode() {
        return Lyhenne.GetHashCode() ^ PitkaNimi.GetHashCode() /* ^ etc ... */;
    }
}

或者,实现自定义 IEqualityComparer 接口。如果 ORM 映射器依赖于默认的等于值(如实体框架),则这可能更可取。IEqualityComparer