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

Check if 2 objects contain the same data in fields

我有一个 Pharmacy class,其中包含很多属性,Pharmacy 通过将 ID 属性 声明为唯一的钥匙。

我有代码可以将 table 中的所有行从 MySQL 返回到 Pharmacy 对象及其属性。

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

这就是 class 的样子。

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);
            }
        }

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

Equals 的标准实现仅检查引用相等性。 What is the default behavior of Equals Method?

您可以覆盖 Equals 的行为。 Guidelines for Overriding Equals() and Operator == (C# Programming Guide).

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 IEqualityComparer Interface。如果您的 ORM Mapper 依赖于默认的 equals(就像 Entity Framework 那样),这可能更可取。