Moyen correct de remplacer Equals () et GetHashCode ()

Je n’ai jamais vraiment fait ça auparavant, alors j’espérais que quelqu’un puisse me montrer ce qu’il fallait pour implémenter un remplacement de Except () et GetHashCode () pour ma classe.

J’essaie de modifier la classe pour pouvoir utiliser la méthode 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 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 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 == py); } 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 == py); } //public override int GetHashCode() //{ // return ReferenceId;// ^ y; //}} 

J’ai jeté un coup d’oeil à http://msdn.microsoft.com/en-us/library/ms173147.aspx mais j’espérais que quelqu’un pourrait me montrer dans mon propre exemple.

Toute aide serait appréciée.

Je vous remercie

Vous pouvez remplacer Equals () et GetHashCode () dans votre classe comme ceci:

 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(); } 
 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(); } 

Soyez prudent lorsque vous utilisez une clé primaire comme test d’égalité lors de la substitution de Equals () car elle ne fonctionne que APRÈS la persistance de l’object. Avant cela, vos objects n’ont pas encore de clé primaire et les identifiants de ceux en mémoire sont tous nuls.

J’utilise base.Equals () si l’un des identifiants d’object est zéro mais qu’il existe probablement une méthode plus robuste.