2009-10-27 60 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

相关问题