2009-10-27 7 views
6

tengo una clase tales:GetHashCode para una clase con un objeto de lista

public class Cycle 
{ 
      public List<int> Edges 
     { 
      get; 
      private set; 
     } 

     public override bool Equals(object obj) 
     { 
      Cycle cycle = (Cycle)obj; 

      var list1 = cycle.Edges; 
      var list2 = Edges; 
      var same = list1.Except(list2).Count() == 0 && 
         list2.Except(list1).Count() == 0; 
      return same; 

     } 

     public override int GetHashCode() 
     { 
     // return Edges.GetHashCode(); 
     } 
} 

Como se puede ver, si dos Edge Las listas son los mismos, entonces considero la Cycles como el mismo.

El problema ahora es cómo implementar el GetHashCode()?

me trataron Edges.GetHashCode(), pero el problema es que dos List<Cycle>, con los mismos objetos pero Cycle diferentes órdenes, se considerará diferente, a pesar de que deben ser los mismos.

+0

'Excepto' es una operación de conjunto que solo le proporciona los elementos distintos. Si los elementos distintos son lo único que importa, entonces puede ser que use 'HashSet ' es una mejor opción. Tiene 'HashSet .CreateSetComparer' que hace todo esto gratis. En cualquier caso, si desea comparar los elementos distintos solo para la igualdad, entonces '! Any' es más eficaz que' Count == 0'. Como '! List1.Except (list2) .Any() && ! List2.Except (list1) .Any();'. – nawfal

Respuesta

14

Se podría hacer algo como:

override int GetHashCode() 
{ 
    return Edges.Distinct().Aggregate(0, (x,y) =>x.GetHashCode()^y.GetHashCode()); 
} 

Es simple, pero debe consistente.

+0

+1 No veo en qué caso puede fallar para dos listas iguales, ¿pueden dar más detalles? – Groo

+0

{1,2,3} vs {3,3,2,2,1,1} – leppie

+1

¿Se requiere 'OrderBy' realmente aquí? Creo que esto debería hacer: 'Edges.Distinct(). Aggregate (0, (x, y) => x^y.GetHashCode())'. O '(int) Edges.Distinct(). Aggregate ((x, y) => x.GetHashCode()^y.GetHashCode())' - el mismo, siendo el anterior más conciso. – nawfal

Cuestiones relacionadas