检查字段

时间:2017-10-13 07:39:07

标签: c# .net list object equality

我有一个包含许多属性的Pharmacy类,并且Pharmacy属性作为键被声明为唯一。ID

我有代码将MySQL中的表中的所有行提取回Pharmacy对象及其属性。

我想比较两个List<Pharmacy>对象中的条目并检查两个表中是否存在相同的ID,如果它不存在则将其添加到新的List<Pharmacy 。如果两者中都存在ID,但对象中的数据不同,则将该对象保存到新的List<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);
            }
        }

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

1 个答案:

答案 0 :(得分:4)

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那样),那么这可能更好。