2012-01-06 36 views
5

Các phím của Dictionary có cần so sánh được với sự bình đẳng không?C# yêu cầu bình đẳng từ điển

Ví dụ

Class mytype 
{ 
    public bool equals(mytype other) 
    { 
     return ...; 
    } 
} 

Trong trường hợp của tôi họ sẽ không bình đẳng, trừ khi họ là những ví dụ tương tự.

Nếu tôi cần triển khai bình đẳng, tôi có nên có một giá trị số lớn gia tăng với mỗi phiên bản mới của mytype được tạo không?

Trả lời

3

Nếu các lớp học của bạn chỉ là equal nếu chúng giống nhau, thì bạn không cần phải làm bất cứ điều gì để sử dụng chúng trong một Dictionary. Các lớp (các kiểu tham chiếu) được coi là bằng nhau nếu và chỉ khi tham chiếu đến cùng một đối tượng.

From the documentation of GetHashCode

Đối với các lớp thừa kế của Object, phương pháp GetHashCode có thể uỷ thác cho việc thực hiện Object.GetHashCode, khi và chỉ khi đó lớp có nguồn gốc xác định giá trị bình đẳng để được bình đẳng tham khảo và loại không phải là một loại giá trị .

Điều này có vẻ đúng trong trường hợp của bạn. Theo quy tắc chung, nếu bạn ghi đè Bằng bạn cũng cần ghi đè GetHashCode nhưng điều này không cần thiết trong trường hợp của bạn làm mặc định là những gì bạn đang tìm kiếm.

+0

Cảm ơn, một câu trả lời hay. – alan2here

1

Theo mặc định, bình đẳng dựa trên cá thể. Hai trường hợp riêng biệt không bao giờ bằng nhau. Bạn chỉ có thể thay đổi điều đó bằng cách cung cấp phương thức Equals của riêng bạn.

+1

bạn cũng muốn thực hiện 'GetHashCode()' –

0

Không, không có loại khó khăn về Dictionary<TKey, TValue>

2

Chỉ khi họ đang được sử dụng như một chìa khóa và bạn không muốn tương đương căn cứ vào thể hiện của đối tượng riêng của mình. Nếu bạn chỉ muốn tham chiếu đến cùng một trường hợp tương đương, bạn tốt và không cần làm gì cả, nhưng nếu bạn đang sử dụng kiểu của mình làm khóa và bạn muốn các trường hợp "tương đương" được xem là bằng nhau, lớp của bạn phải triển khai Equals()GetHashCode().

Nếu loại tùy chỉnh của bạn đang được lưu trữ dưới dạng giá trị và không được sử dụng làm khóa, điều này là không cần thiết, tất nhiên. Ví dụ: trong trường hợp này MyType không cần ghi đè Equals() hoặc GetHashCode() vì nó chỉ được sử dụng làm giá trị chứ không phải là khóa lưu trữ.

Dictionary<string, MyType> x; 

Tuy nhiên trong trường hợp này:

Dictionary<MyType, string> x; 

kiểu tùy chỉnh của bạn là chìa khóa, và do đó nó sẽ cần phải ghi đè Equals()GetHashCode(). Các GetHashCode() được sử dụng để xác định vị trí mà nó băm, và Equals() được sử dụng để giải quyết va chạm trên mã băm (trong số những thứ khác).

Bạn cần ghi đè hai phương thức tương tự khi xử lý nhiều truy vấn LINQ. Ngoài ra, bạn có thể cung cấp một lớp độc lập IEqualityComparer ngoài lớp học của bạn để xác định xem hai trường hợp có tương đương hay không.

+0

Nhưng nếu bình đẳng tham chiếu là hành vi mong muốn, loại không nên ghi đè các phương thức này, và OP dường như chỉ ra rằng bình đẳng tham chiếu * là * hành vi mong muốn. – phoog

+0

@phoog: câu hỏi hay, tuyên bố của ông "Trong trường hợp của tôi, họ sẽ không bằng nhau trừ khi họ là cùng một ví dụ" với tôi có thể được đọc theo cách như trong "đây là những gì nó đang làm" hoặc "đây là những gì tôi muốn để làm ", tôi cập nhật câu trả lời của tôi để phản ánh một trong hai cách. –

0

Xem thuộc tính EqualityComparer.Default<T>.Đây là cách từ điển có được một bộ so sánh bình đẳng nếu bạn không cung cấp nó bằng một.

này trả về một comparer bình đẳng dựa trên loại & khả năng của T.

Ví dụ, nếu T kéo dài IEquatable, EqualityComparer.Default sẽ trở lại một thể hiện comparer bình đẳng mà sử dụng giao diện IEquatable. Nếu không, nó sẽ trả về một cá thể so sánh bình đẳng sử dụng phương thức Object.Equals.

Phương pháp Object.Equals, theo mặc định cho loại tham chiếu, sử dụng bình đẳng tham chiếu (Object.ReferenceEquals) trừ khi bạn ghi đè nó bằng so sánh tùy chỉnh.

Phương pháp Object.Equals, theo mặc định cho các loại giá trị, sử dụng sự phản chiếu để so sánh các trường của cấu trúc cho bình đẳng *. Phản ánh chậm, đây là lý do tại sao nó luôn được khuyến khích để ghi đè Equals trong các loại giá trị.

* trừ khi đó là loại giá trị có thể ghi được trong trường hợp các bit thô được so sánh.

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