2017-10-13 5 views
2

많은 속성이 포함 된 Pharmacy 클래스가 있고 ID 속성을 키로 사용하여 Pharmacy을 고유하게 선언했습니다.두 개의 객체가 동일한 데이터를 필드에 포함하는지 확인

MySQL의 테이블에있는 모든 행을 Pharmacy의 속성을 가진 객체로 가져 오는 코드가 있습니다.

나는 그들에있는 항목을 두 List<Pharmacy> 개체를 비교하고 그 다음 존재 새로운 List<Pharmacy에 추가하지 않을 경우 같은 ID이 두 테이블에 존재하는지 확인합니다. 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

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

또는 사용자 정의 IEqualityComparer IEqualityComparer Interface를 구현합니다. ORM Mapper가 Entity Framework처럼 기본 같음을 사용하는 경우이 방법이 더 좋습니다.