Chỉ cần để làm cho nó rõ ràng: Có một điều quan trọng về Dictionary<TKey, TValue>
và GetHashCode()
: từ điển sử dụng GetHashCode để xác định xem hai phím đều bình đẳng Ví dụ: nếu <TKey>
là loại tùy chỉnh, bạn nên quan tâm đến việc thực hiện GetHashCode()
cẩn thận. Như Andrew Hare đã chỉ ra điều này là dễ dàng, nếu bạn có một loại đơn giản để xác định đối tượng tùy chỉnh của bạn một cách rõ ràng. Trong trường hợp bạn có một số nhận dạng kết hợp, nó sẽ phức tạp hơn một chút.
Ví dụ: xem xét một số phức là TKey
. Một số phức được xác định bởi số thực và phần ảo của nó. Cả hai loại đều đơn giản, ví dụ: double
. Nhưng làm thế nào bạn sẽ xác định được nếu hai số phức bằng nhau? Bạn triển khai GetHashode()
cho loại phức hợp tùy chỉnh của mình và kết hợp cả hai phần xác định.
Bạn tìm đọc thêm sau trên here.
CẬP NHẬT
Dựa trên nhận xét Ergwun của tôi đã kiểm tra hành vi của Dictionary<TKey, TValue>.Add
với sự tôn trọng đặc biệt để TKey
's thực hiện Equals(object)
và GetHashCode()
. Tôi phải thú nhận rằng tôi đã khá ngạc nhiên bởi kết quả.
Với hai đối tượng k1
và k2
loại TKey
, hai đối tượng tùy ý v1
và v2
loại TValue
, và một từ điển rỗng d
loại Dictionary<TKey, TValue>
, đây là những gì sẽ xảy ra khi thêm v1
với phím k1
-d
đầu tiên và v2
với phím k2
thứ hai (tùy thuộc vào việc thực hiện các TKey.Equals(object)
và TKey.GetHashCode()
):
k1.Equals(k2) k1.GetHashCode() == k2.GetHashCode() d.Add(k2, v2)
false false ok
false true ok
true false ok
true true System.ArgumentException
Côn clusion: Tôi đã sai lầm như ban đầu tôi nghĩ trường hợp thứ hai (trong đó Equals
trả về false
nhưng cả hai đối tượng chính có cùng mã băm) sẽ tăng ArgumentException
. Nhưng khi trường hợp thứ ba hiển thị từ điển theo một số cách, hãy sử dụng GetHashCode()
. Dù sao nó có vẻ là lời khuyên tốt rằng hai đối tượng có cùng loại và bằng nhau phải trả lại mã băm giống nhau để đảm bảo rằng các trường hợp Dictionary<TKey, TValue>
hoạt động chính xác.
Nguồn
2009-09-10 20:21:29
có thể trùng lặp của [Tại sao điều quan trọng là ghi đè GetHashCode khi phương thức Equals bị ghi đè?] (Http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when- equals-is-overridden) – nawfal