Correct way to override Equals() and GetHashCode()

I have never really done this before so i was hoping that someone could show me the correct what of implementing a override of Except() and GetHashCode() for my class.

I'm trying to modify the class so that i can use the LINQ Except() method.

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

I have taken a look at http://msdn.microsoft.com/en-us/library/ms173147.aspx but i was hoping someone could show me within my own example.

Any help would be appreciated.

Thank you

162540 次浏览

您可以在类上重写 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 ()中相等性的测试时要小心,因为它只在对象被持久化之后才能工作。在此之前,您的对象还没有主键,并且内存中的 ID 都是零。

如果任何一个对象 ID 为零,则使用 base.Equals () ,但可能有更健壮的方法。