2012-06-11 38 views
5
// No overrides required .. let CLR take care of equal and hashcode. 
Class Foo {public Name{get; set;} public Address{get; set;}} 

Dictionary<List<Foo>, int> map = new Dictionary<List<Foo>, int>(); 

Câu hỏi:Tôi có thể sử dụng Danh sách các đối tượng làm Khóa Từ Điển không?

Mã này có ổn không? Tôi hiểu rằng đó là một chìa khóa trong Bản đồ, Foo cần phải ghi đè bằng và phương thức hashcode - hoặc ghi đè cả hai hoặc không có.

Tôi đã tự hỏi điều gì về Danh sách đối tượng làm khóa? Bình đẳng nghĩa là gì khi nói đến Danh sách? bản đồ được xác định ở trên có an toàn từ vấn đề "đối tượng bị mất trong bản đồ" không?

-Karephul

Trả lời

3
List<int> a = new List<int>(1, 2, 3); 
List<int> b = new List<int>(1, 2, 3); //different instance than a 

Dictionary<List<int>, int>> map = new Dictionary<List<int>, int>>(); 
map.Add(a, a.Sum()); 
int aSum = map[b]; //KeyNotFoundException because this is a different instance. 


HashSet<int> a = new HashSet<int>(1, 2, 3); 
HashSet<int> b = new HashSet<int>(1, 2, 3); //different instance than a 

Dictionary<HashSet<int>, int>> map1 = new Dictionary<HashSet<int>, int>>(); 
map1.Add(a, a.Sum()); 
int aSum = map1[b]; //KeyNotFoundException because this is a different instance. 


HashSet<int> a = new HashSet<int>(1, 2, 3); 
HashSet<int> b = new HashSet<int>(1, 2, 3); //different instance than a 

Dictionary<HashSet<int>, int>> map2 = new Dictionary<HashSet<int>, int>> 
    (HashSet<int>.CreateSetComparer()); //instance comparison not used - equal sets are equal 
map2.Add(a, a.Sum()); 
int aSum = map2[b]; //6 
+0

+ 1 cho ví dụ – karephul

5

này sẽ chỉ làm việc nếu bạn sử dụng bản gốc List<T> trường hợp như phím.
Nếu bạn tạo mới List<T> với cùng một mục, nó sẽ không được coi là cùng một khóa, vì List<T> không ghi đè Equals()GetHashCode().

Nói cách khác, nó sẽ sử dụng bình đẳng tham chiếu.

Nếu bạn muốn thay đổi điều đó, bạn có thể viết IEqualityComparer<List<T>>.

+0

+ 1 để có câu trả lời hay. – karephul

0

Chắc chắn, bạn có thể , nhưng đó sẽ là vô cùng hạn chế. Nói một cách đơn giản, danh sách kết hợp của Foo, ngay cả khi các thành phần danh sách đều giống nhau Foo, không phải là cùng một kiểu List<Foo>. Vì vậy, bạn sẽ cần phải giữ xung quanh các tài liệu tham khảo trong một số thời trang không mơ hồ để đảm bảo rằng phím là như nhau, hoặc thực hiện một chức năng khớp chìa khóa phức tạp.

Nó sẽ ở xa, xa tốt hơn để chỉ cần sử dụng loại khóa tốt hơn.

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