正确的方法来覆盖Equals()和GetHashCode()

我从来没有真正做过,所以我希望有人可以告诉我正确的是为我的类实现Except()和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 == 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; //}} 

我看了一下http://msdn.microsoft.com/en-us/library/ms173147.aspx,但我希望有人能够在我自己的例子中显示我。

任何帮助,将不胜感激。

谢谢

你可以像这样覆盖你的类的Equals()和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(); } 
 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(); } 

使用主键作为重写Equals()时的相等性testing时要小心,因为它只在对象被持久化后才起作用。 在此之前,对象还没有主键,内存中的ID全部为零。

我使用base.Equals()如果任何一个对象ID是零,但可能有一个更强大的方式。