2017-10-13 56 views
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

回答

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

或者您執行自定義IEqualityComparerIEqualityComparer Interface。如果你的ORM Mapper依賴於默認的equals(比如Entity Framework),這可能會更好。

相關問題