2012-02-16 16 views
65

Bunu daha önce hiç yapmadım, böylece birinin benim sınıfım için Except() ve GetHashCode() öğelerini geçersiz kılmanın ne olduğunu gösterebileceğini umuyordum.Eşitleme yapmak için doğru yol Eşittir() ve GetHashCode()

Sınıfı değiştirmeye çalışıyorum, böylece LINQ Except() yöntemini kullanabilirim.

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

Ben http://msdn.microsoft.com/en-us/library/ms173147.aspx bir göz almış ama kimse benim kendi örnek içinde bana göster umuyordum.

Herhangi bir yardım için teşekkür ederiz.

böyle classınıza size

+0

Bağlandığınız sayfada: "Devre dışı olmayan türlerde işleç == değerini geçersiz kılmak iyi bir fikir değildir." Except() çalışmasını yapmak için başka ve daha iyi yollar vardır. –

+0

@Henk Holterman, eşitlik operatörünü geçersiz kılar == önerilmez; Override Eşittir seçeneği önerilmez. –

+0

@SouhaiebBesbes - eşittir '==' ve 'Denklemler()' tutmak için önerilir (çok güçlü). –

cevap

67

Sen geçersiz kılabilirsiniz Eşittir ederiz() ve GetHashCode(): geçersiz kılma eşitlik için test olarak bir birincil anahtar kullanırken

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 uygulamak zorunda değil miyim? Bir hata aldığımda: DataTransferObjects.RecommendationDTO arabirim üyesi System.IEquatable .Equals uygulamıyor DataTransferObjects.RecommendationDTO) – Nugs

+0

Özellikle karma kod oluşturma ve ilgili == ve! = Operatörlerini geçersiz kılan en iyi uygulamaları ele almayıp çok temel bir çözümdür. – LostNomad311

+0

, genel durumda kontrolün yeterli olmadığından, objenin geçerli olandan türetilen bir sınıfın örneği olabileceğinden – 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

dikkatli olun Eşittir(), çünkü sadece nesnenin devam ettirilmesinden sonra çalışır. Bundan önce, nesnelerin henüz birincil anahtarları yok ve bellekte bulunanların kimlikleri sıfır.

Nesne kimlikleri sıfırdan biriyse base.quals() yöntemini kullanıyorum ancak muhtemelen daha sağlam bir yol var.

İlgili konular