2009-10-27 58 views
6

一類我有這樣一個類:的GetHashCode用一個列表對象

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

正如你可以看到,如果兩個Edge列表是相同的,那麼我認爲在Cycles一樣。

現在的問題是如何實施GetHashCode()

我試過Edges.GetHashCode(),但問題是,兩個List<Cycle>,與Cycle對象,但訂單不同,將被視爲不同,即使它們應該是相同的。

+0

'除了'是一個設置操作,它只給你不同的項目。如果不同的項目都是重要的,那麼可能使用'HashSet '是一個更好的選擇。它有'HashSet .CreateSetComparer'這一切都是免費的。在任何情況下,如果你想比較不同的項目只是爲了相等,那麼'!任何'比'Count == 0'更高效。 (list1).Any();&。 – nawfal 2014-08-11 06:13:20

回答

14

你可以這樣做:

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

它是簡單的,但應該是一致的。

+0

+1我不認爲在這種情況下,它可能會失敗的兩個平等名單,你能否詳細說明? – Groo 2009-10-27 11:43:38

+0

{1,2,3} vs {3,3,2,2,1,1} – leppie 2009-10-27 13:43:11

+1

是這裏真的需要'OrderBy'嗎?我認爲這應該做:'Edges.Distinct()。Aggregate(0,(x,y)=> x^y.GetHashCode())'。或'(int)Edges.Distinct()。Aggregate((x,y)=> x.GetHashCode()^ y.GetHashCode()) - 同樣,前者更簡潔。 – nawfal 2014-08-11 06:16:35

相關問題