2009-10-27 5 views
6

J'ai une telle classe:GetHashCode pour une classe avec une liste d'objets

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

Comme vous pouvez le voir, si deux listes Edge sont les mêmes, alors je considère le Cycles comme le même. Le problème est maintenant comment implémenter le GetHashCode()?

J'ai essayé Edges.GetHashCode(), mais le problème est que deux List<Cycle>, avec les mêmes objets Cycle mais différents ordres, seront réputées avoir été différentes, même si elles doivent être les mêmes.

+0

'Except' est une opération de définition qui ne vous donne que les éléments distincts. Si des éléments distincts sont tout ce qui compte alors vous pouvez utiliser 'HashSet ' est un meilleur choix. Il a 'HashSet .CreateSetComparer' qui fait tout cela gratuitement. Dans tous les cas, si vous voulez comparer les éléments distincts uniquement pour l'égalité, alors "! Any" est plus performant que "Count == 0". Comme '! List1.Except (list2) .Any() && ! List2.Except (liste1) .Any();'. – nawfal

Répondre

14

Vous pouvez faire quelque chose comme:

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

Il est simple, mais devrait cohérente.

+0

+1 Je ne vois pas dans quel cas il peut échouer pour deux listes égales, pouvez-vous élaborer? – Groo

+0

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

+1

Est-ce que 'OrderBy' est vraiment nécessaire ici? Je pense que cela devrait faire: 'Edges.Distinct(). Aggregate (0, (x, y) => x^y.GetHashCode())'. Ou '(int) Edges.Distinct(). Agréger ((x, y) => x.GetHashCode()^y.GetHashCode())' - le même, l'ancien étant plus concis. – nawfal

Questions connexes