2012-02-16 2 views
65

전 실제로이 작업을 수행 한 적이 없으므로 누군가 내게 Except() 및 GetHashCode()를 재정의 한 클래스를 표시 할 수 있기를 바랍니다.올바른 방법으로 Equals() 및 GetHashCode()를 재정의합니다.

LINQ Except() 메서드를 사용할 수 있도록 클래스를 수정하려고합니다.

public class RecommendationDTO{public Guid RecommendationId { get; set; } 
public Guid ProfileId { get; set; } 
public Guid ReferenceId { get; set; } 
public int TypeId { get; set; } 
public IList<TagDTO> Tags { get; set; } 
public DateTime CreatedOn { get; set; } 
public DateTime? ModifiedOn { get; set; } 
public bool IsActive { get; set; } 
public object ReferencedObject { get; set; } 
public bool IsSystemRecommendation { get; set; } 
public int VisibilityScore { get; set; } 

public RecommendationDTO() 
{ 
} 

public RecommendationDTO(Guid recommendationid, 
          Guid profileid, 
          Guid referenceid, 
          int typeid, 
          IList<TagDTO> tags, 
          DateTime createdon, 
          DateTime modifiedon, 
          bool isactive, 
          object referencedobject) 
{ 
    RecommendationId = recommendationid; 
    ProfileId = profileid; 
    ReferenceId = referenceid; 
    TypeId = typeid; 
    Tags = tags; 
    CreatedOn = createdon; 
    ModifiedOn = modifiedon; 
    ReferencedObject = referencedobject; 
    IsActive = isactive; 
} 

public override bool Equals(System.Object obj) 
{ 
    // If parameter is null return false. 
    if (obj == null) 
    { 
     return false; 
    } 

    // If parameter cannot be cast to Point return false. 
    RecommendationDTO p = obj as RecommendationDTO; 
    if ((System.Object)p == null) 
    { 
     return false; 
    } 

    // Return true if the fields match: 
    return (ReferenceId == p.ReferenceId);// && (y == p.y); 
} 

public bool Equals(RecommendationDTO p) 
{ 
    // If parameter is null return false: 
    if ((object)p == null) 
    { 
     return false; 
    } 

    // Return true if the fields match: 
    return (ReferenceId == p.ReferenceId);// && (y == p.y); 
} 

//public override int GetHashCode() 
//{ 
// return ReferenceId;//^y; 
//}} 

나는 http://msdn.microsoft.com/en-us/library/ms173147.aspx을 살펴본했지만 나는 누군가가 내 자신의 예에서 저를 보여줄 수 기대했다.

도움을 주시면 감사하겠습니다.

은 다음과 같이 클래스에 당신에게

+0

연결된 페이지에서 "불변 타입에서 연산자 ==를 재정의하는 것은 좋지 않습니다." Except() 작업을 수행하는 다른 좋은 방법이 있습니다. –

+0

@Henk Holterman 무시 우선 순위 연산자 ==는 권장하지 않습니다. 같음 오버라이드는 권장되지 않습니다. –

+0

@SouhaiebBesbes -'=='와'Equals()'를 동기화 상태로 유지하는 것이 좋습니다. –

답변

67

당신은 무시할 수 있습니다 같음 감사() 및 GetHashCode() : 재정의 평등에 대한 테스트 등의 기본 키를 사용하는 경우

public override bool Equals(object obj) 
{ 
    var item = obj as RecommendationDTO; 

    if (item == null) 
    { 
     return false; 
    } 

    return this.RecommendationId.Equals(item.RecommendationId); 
} 

public override int GetHashCode() 
{ 
    return this.RecommendationId.GetHashCode(); 
} 
+0

IEquatable을 구현할 필요가 없습니까?> : public class RecommendationDTO : IEquatable ... 오류가 발생하면 DataTransferObjects.RecommendationDTO가 인터페이스 멤버 System.IEquatable 를 구현하지 않습니다 .Equals DataTransferObjects.RecommendationDTO) – Nugs

+0

이것은 해시 코드 생성 및 관련 == 및! = 연산자를 무시하고 모범 사례를 다루지 않는 매우 기본적인 솔루션입니다. obj가 현재 클래스에서 파생 된 클래스의 인스턴스가 될 수 있기 때문에 일반적인 경우에는 – LostNomad311

+0

을 검사로는 충분하지 않습니다. – ovolko

10
public override bool Equals(System.Object obj) 
{ 
    // Check if the object is a RecommendationDTO. 
    // The initial null check is unnecessary as the cast will result in null 
    // if obj is null to start with. 
    var recommendationDTO = obj as RecommendationDTO; 

    if (recommendationDTO == null) 
    { 
     // If it is null then it is not equal to this instance. 
     return false; 
    } 

    // Instances are considered equal if the ReferenceId matches. 
    return this.ReferenceId == recommendationDTO.ReferenceId; 
} 

public override int GetHashCode() 
{ 
    // Returning the hashcode of the Guid used for the reference id will be 
    // sufficient and would only cause a problem if RecommendationDTO objects 
    // were stored in a non-generic hash set along side other guid instances 
    // which is very unlikely! 
    return this.ReferenceId.GetHashCode(); 
} 
7

조심 객체가 지속 된 후에 만 ​​작동하기 때문에 같음() 그 전에 객체에는 기본 키가없고 메모리에있는 ID는 모두 0입니다.

개체 ID 중 하나가 0이지만 더 강력한 방법이있는 경우 base.Equals()를 사용합니다.