c# equality gethashcode

gethashcode c#



Forma correcta de reemplazar Igual() y GetHashCode() (3)

Esta pregunta ya tiene una respuesta aquí:

Nunca he hecho esto antes, así que esperaba que alguien me mostrara el correcto de implementar una excepción de Except () y GetHashCode () para mi clase.

Estoy intentando modificar la clase para poder usar el método 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; //}}

He echado un vistazo a http://msdn.microsoft.com/en-us/library/ms173147.aspx pero esperaba que alguien pudiera mostrarme en mi propio ejemplo.

Cualquier ayuda sería apreciada.

Gracias


Puede anular Igual () y GetHashCode () en su clase de esta manera:

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


Tenga cuidado al usar una clave principal como prueba de igualdad al anular Equals () porque solo funciona DESPUÉS de que el objeto se haya conservado. Antes de eso, sus objetos aún no tienen claves primarias y los ID de los que están en la memoria son cero.

Uso base.Equals () si cualquiera de los ID de objeto es cero, pero probablemente haya una forma más robusta.


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