2009-10-27 27 views
6

Tôi có một lớp học như:GetHashCode cho một lớp với một danh sách Object

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

Như bạn có thể thấy, nếu hai Edge Chức năng đều giống nhau, sau đó tôi xét thấy các Cycles như giống nhau.

Vấn đề bây giờ là cách triển khai GetHashCode()?

Tôi đã thử Edges.GetHashCode(), nhưng vấn đề là hai List<Cycle>, với cùng một đối tượng Cycle nhưng các đơn đặt hàng khác nhau, sẽ được coi là khác nhau, mặc dù chúng phải giống nhau.

+0

'Ngoại trừ' là một thao tác được đặt chỉ cung cấp cho bạn các mục riêng biệt. Nếu các mục riêng biệt là tất cả những vấn đề thì có thể sử dụng 'HashSet ' là một lựa chọn tốt hơn. Nó có 'HashSet .CreateSetComparer' thực hiện tất cả điều này miễn phí. Trong mọi trường hợp nếu bạn muốn so sánh các mục riêng biệt chỉ để bình đẳng, thì '! Bất kỳ' nào có hiệu suất cao hơn' Count == 0'. Giống như '! List1.Except (list2) .Any() && ! List2.Except (list1) .Any();'. – nawfal

Trả lời

14

Bạn có thể làm một cái gì đó như:

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

Nó là đơn giản, nhưng nên nhất quán.

+0

+1 Tôi không thấy trong trường hợp nó có thể thất bại cho hai danh sách bằng nhau, bạn có thể xây dựng? – Groo

+0

{1,2,3} so với {3,3,2,2,1,1} – leppie

+1

là 'OrderBy' có thực sự được yêu cầu ở đây không? Tôi nghĩ rằng điều này nên làm: 'Edges.Distinct(). Tổng hợp (0, (x, y) => x^y.GetHashCode())'. Hoặc '(int) Edges.Distinct(). Tổng hợp ((x, y) => x.GetHashCode()^y.GetHashCode())' - giống nhau, trước đây ngắn gọn hơn. – nawfal

Các vấn đề liên quan