2017-10-13 7 views
2

Pharmacyクラスには多くのプロパティが含まれ、PharmacyIDプロパティをキーとして一意であると宣言されています。2つのオブジェクトに同じデータがフィールド内に含まれていることを確認します

私は戻ってそのプロパティを持つPharmacyオブジェクトへのMySQLからテーブル内のすべての行をフェッチする代わりに、コードを持っています。

2つのテーブルを比較し、両方のテーブルに同じ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

あなたはオプション可能性があり、そうでない場合にのみ参照が –

+1

Serializeを両方のオブジェクトを比較し、結果の文字列を比較している、IDプロパティを比較するために、 'Equals'を上書きする必要がありますか? – 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が(Entity Frameworkのように)デフォルトのequalsに依存している場合は、これが望ましい場合があります。

関連する問題