SetEquals
không tuân theo cùng một hợp đồng như Equals
. Đặc biệt nó không đối xứng, vì đối số chỉ là IEnumerable<T>
thay vì ISet<T>
. Điều này cho phép bạn kiểm tra mức độ bình đẳng đã đặt trong khi chỉ có một thiết lập. Xem xét:
List<int> intList = new List<int> { 1, 2, 3 };
HashSet<int> intSet = new HashSet<int>(intList);
Bây giờ chúng ta có thể sử dụng:
Console.WriteLine(intSet.SetEquals(intList));
... nhưng chúng tôi không thể thực hiện Equals
trong cùng một cách mà không thực thi các hành vi tương tự trên List<int>
và mỗi IEnumerable<T>
thực hiện khác.
Thậm chí nếu chúng tôi hạn chế nó cho các bộ khác, có một câu hỏi thú vị về sự bình đẳng thực sự có ý nghĩa gì. Ví dụ: xem xét hai bộ HashSet<string>
có chứa các chuỗi giống nhau, nhưng có các trình so sánh bình đẳng khác nhau. (Có lẽ là một trong những trường hợp nhạy cảm và một là không.) Là những người bình đẳng, hay không? SetEquals
quản lý để tránh các câu hỏi triết học như vậy bằng cách tránh cố gắng quá chung chung.
Điều gì về một số HashSet<int>
và SortedSet<int>
? Họ có thể bằng nhau không? Chúng có thể có cùng giá trị - nhưng thứ tự của một giá trị không xác định.
Nhìn chung, ý tưởng của Object.Equals
và Object.GetHashCode
quá rộng trong chế độ xem của tôi. Thông thường, bạn muốn có một loại cụ thể về sự bình đẳng - và thường không có ý nghĩa gì khi so sánh các đối tượng bình đẳng ngay từ đầu. Điều này có thể dễ dàng hình thành các chủ đề của một rant hoàn toàn khác nhau, nhưng trong khi chờ đợi tôi ít nhất là vui mừng rằng NET đã không cố gắng áp dụng ý tưởng này quá rộng để bộ sưu tập. Khả năng sử dụng SetEquals
với ý nghĩa được xác định rõ là hữu ích hơn, IMO.
Nguồn
2013-06-20 14:04:00
bạn có nghĩa là 'ISet .SetEquals' http://msdn.microsoft.com/en-us/library/dd412096.aspx? –
Jodrell
tôi nghĩ rằng tài liệu hướng dẫn khá rõ ràng về sự khác biệt là gì. –