2009-10-27 38 views
9

Tôi có một lớp, hiển thị bên dưới, được sử dụng làm khóa trong Dictionary<ValuesAandB, string> Tôi đang gặp sự cố khi tìm bất kỳ khóa nào trong từ điển này nó ở tất cả. Như bạn thấy, tôi đã ghi đè EqualsGetHashCode.Lớp tùy chỉnh được sử dụng làm khóa trong Từ điển nhưng khóa không tìm thấy

Để tìm kiếm chìa khóa Tôi đang sử dụng

ValuesAandB key = new ValuesAandB(A,B); 
if (DictionaryName.ContainsKey(key)) { 
    ... 
} 

Có điều gì khác mà tôi đang thiếu? Bất cứ ai có thể chỉ ra những gì tôi đang làm sai?

private class ValuesAandB { 
    public string valueA; 
    public string valueB; 

    // Constructor 
    public ValuesAandB (string valueAIn, string valueBIn) { 
    valueA = valueAIn; 
    valueB = ValueBIn; 
    } 

    public class EqualityComparer : IEqualityComparer<ValuesAandB> { 
     public bool Equals(ValuesAandB x, ValuesAandB y) { 
     return ((x.valueA.Equals(y.valueA)) && (x.valueB.Equals(y.valueB))); 
     } 
     public int GetHashCode(ValuesAandB x) { 
     return x.valueA.GetHashCode()^x.valueB.GetHashCode(); 
     } 
    } 
} 

Và trước khi có ai hỏi, có giá trị trong Từ điển!

Trả lời

9

Bạn đang xây dựng từ điển như thế nào? Bạn đang đi qua so sánh bình đẳng tùy chỉnh của bạn trong constructor của nó?

6

Bạn chưa ghi đè Equals và GetHashCode. Bạn đã thực hiện một lớp thứ hai có thể phục vụ như một EqualityComparer. Nếu bạn không xây dựng từ điển với EqualityComparer, nó sẽ không được sử dụng. Việc sửa lỗi đơn giản nhất là ghi đè GetHashCode và Equals trực tiếp thay vì thực hiện so sánh (thường chỉ thú vị khi bạn cần cung cấp nhiều loại so sánh khác nhau (ví dụ như trường hợp nhạy cảm và phân biệt chữ hoa chữ thường) hoặc khi bạn cần có thể thực hiện so sánh trên một lớp mà bạn không kiểm soát

+0

Có, nhận xét được đưa lên máy bay và câu trả lời chính xác khi nó bật ra, nhưng Greg Beech đã đi trước bạn sợ. Cảm ơn bạn đã giúp đỡ. –

1

Dường như bạn đang so sánh hai chuỗi. Iirc, khi sử dụng .Equals(), bạn đang so sánh tham chiếu của chuỗi chứ không phải nội dung thực Để thực hiện EqualityComparer hoạt động với các chuỗi, bạn sẽ muốn sử dụng phương thức String.Compare()

public class EqualityComparer : IEqualityComparer<ValuesAandB> 
{ 
    public bool Equals(ValuesAandB x, ValuesAandB y) 
    { 
      return ((String.Compare(x.valueA,y.valueA) == 0) && 
      (String.Compare(x.valueB, y.valueB) == 0)); 
    } 
    // gethashcode stuff here 
} 

Tôi có thể tắt một chút với mã, điều đó sẽ giúp bạn đóng ...

+0

Không, String.Equals (String) là quá tải sẽ được gọi ở đây, mà rất rõ ràng so sánh nội dung. Và trong mọi trường hợp, String.Equals (Object) được ghi đè để thực hiện tương tự. –

+0

* facepalm * Tôi không chắc mình đang nghĩ gì. – cloggins

0

Tôi gặp sự cố này, từ điển đã so sánh các tham chiếu cho khóa của tôi chứ không phải giá trị trong đối tượng.

Tôi đã sử dụng lớp Point tùy chỉnh làm khóa. Tôi overrode ToString() và GetHashCode() phương pháp và viola, tra cứu quan trọng làm việc tốt.

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