2012-04-04 53 views
12

Tôi có một cuốn từ điển được keyed bởi một danh sách:C# Danh sách như từ điển chính

private Dictionary<List<custom_obj>, string> Lookup; 

Tôi đang cố gắng sử dụng containsKey, nhưng nó dường như không được làm việc, và tôi không có ý tưởng tại sao . Dưới đây là thông tin gỡ lỗi từ Cửa sổ ngay lập tức Visual Studio của tôi:

?Lookup.Keys.ElementAt(7)[0] 
{custom_obj} 
    Direction: Down 
    SID: 2540 
?Lookup.Keys.ElementAt(7)[1] 
{custom_obj} 
    Direction: Down 
    SID: 2550 
searchObject[0] 
{custom_obj} 
    Direction: Down 
    SID: 2540 
searchObject[1] 
{custom_obj} 
    Direction: Down 
    SID: 2550 
?Lookup.ContainsKey(searchObject) 
false 

Theo nghĩa thông thường, ContainsKey cuối cùng phải đúng. Hy vọng rằng tôi đã bao gồm đủ thông tin ở đây ... bất kỳ ý tưởng?

Cảm ơn!

Trả lời

14

Ví dụ List<custom_obj> hoạt động như một khóa là bất bình đẳng tham chiếu đến cá thể được tham chiếu bởi searchObject.

Nếu bạn muốn từ điển sử dụng giá trị trong danh sách thay vì bình đẳng tham chiếu để tìm khóa khớp, bạn phải cung cấp IEqualityComparer trong từ điển constructor của từ điển (vì bạn không thể ghi đè bằng và GetHashCode trong List<T>).

3

Điều này sẽ chỉ hoạt động nếu cá thể danh sách thực tế được sử dụng trong tra cứu giống với cá thể được thêm làm khóa. Nó sẽ không so sánh nội dung danh sách. Đây là hành vi tương tự bạn sẽ nhận được nếu bạn cố gắng so sánh hai đối tượng Danh sách trực tiếp.

8

Bạn có hai riêng biệt List s chứa các phần tử giống nhau. Cách chính xác để tìm hiểu xem hai danh sách có bằng nhau hay không bằng phương pháp SequenceEqual.

Bạn không thể theo mặc định làm những gì bạn đang cố gắng làm. Tuy nhiên, bạn có thể viết một tùy chỉnh IEqualityComparer và chuyển nó vào hàm tạo Dictionary.

Đây là một mẫu chung IEqualityComparer:

class ListComparer<T> : IEqualityComparer<List<T>> 
{ 
    public bool Equals(List<T> x, List<T> y) 
    { 
     return x.SequenceEqual(y); 
    } 

    public int GetHashCode(List<T> obj) 
    { 
     int hashcode = 0; 
     foreach (T t in obj) 
     { 
      hashcode ^= t.GetHashCode(); 
     } 
     return hashcode; 
    } 
} 

Bạn có thể muốn cải thiện tình hình thực hiện GetHashCode, vì đây là một giải pháp nhanh chóng-và-bẩn.

+0

GetHashCode bị thiếu lợi tức. –

+0

Lưu ý nhanh: Khi câu trả lời gợi ý, bạn không nên sử dụng Comparer này. Phương thức equals là nhạy cảm với thứ tự nhưng phương thức băm thì không. –

0

Bạn có chắc chắn rằng cá thể bạn đang sử dụng trong phương pháp tra cứu của bạn là cùng một cá thể nằm trong số các khóa từ điển của bạn không? Đó là điều duy nhất tôi có thể nghĩ đến.

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