2009-10-27 4 views
6

Ich habe eine solche Klasse:GetHashCode für eine Klasse mit einer Liste Objekt

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

Wie Sie sehen können, wenn zwei Edge Listen gleich sind, dann halte ich die Cycles als die gleiche.

Das Problem ist jetzt, wie Sie die GetHashCode() implementieren?

Ich versuchte Edges.GetHashCode(), aber das Problem ist, dass zwei List<Cycle>, mit den gleichen Cycle Objekt aber unterschiedlichen Aufträgen, anders angesehen werden, auch wenn sie das gleiche sein sollen.

+0

"Außer" ist eine Set-Operation, die Ihnen nur die einzelnen Elemente gibt. Wenn verschiedene Elemente alles sind, was zählt, dann ist die Verwendung von 'HashSet ' eine bessere Wahl. Es hat 'HashSet .CreateSetComparer', das alles kostenlos macht. In jedem Fall, wenn Sie die einzelnen Elemente nur für die Gleichheit vergleichen möchten, ist '! Any' leistungsfähiger als 'Count == 0'. Wie '! List1.Except (list2) .Any() && ! List2.Except (list1) .Any();'. – nawfal

Antwort

14

Sie etwas tun könnte, wie:

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

Es ist einfach, aber sollte konsistent.

+0

+1 Ich sehe nicht, in welchem ​​Fall es für zwei gleiche Listen fehlschlagen kann, können Sie das ausarbeiten? – Groo

+0

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

+1

ist 'OrderBy' wirklich hier erforderlich? Ich denke, das sollte Folgendes tun: 'Edges.Distinct(). Aggregat (0, (x, y) => x^y.GetHashCode())'. Oder '(int) Edges.Distinct(). Aggregat ((x, y) => x.GetHashCode()^y. GetHashCode())' - das gleiche, früherer, prägnanter. – nawfal

Verwandte Themen