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

问题描述:

我有一个Pharmacy类,其中包含很多属性,并且Pharmacy通过将ID属性作为关键字声明为唯一。检查2个对象是否在字段中包含相同的数据

我有代码将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); 
      } 
     } 

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

+5

你必须重写'Equals'来比较ID属性,否则只有引用被比较 –

+1

序列化这两个对象并比较结果字符串,可能是一个选项? – bartbje

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 ... */; 
    } 
} 

或者您执行自定义IEqualityComparerIEqualityComparer Interface。如果你的ORM Mapper依赖于默认的equals(比如Entity Framework),这可能会更好。