2009-01-30 18 views
36

Tôi đang cố xác định xem có hai đối tượng HashSet trong .NET 3.5 (C#) là các tập hợp bằng nhau không, tức là có cùng giá trị. Điều này có vẻ giống như một cái gì đó rõ ràng là sẽ muốn làm nhưng không ai trong số các chức năng cung cấp dường như cung cấp cho bạn thông tin này.Làm thế nào để bạn xác định nếu hai HashSets là bằng nhau (theo giá trị, không phải bằng tham chiếu)?

Cách tôi có thể nghĩ để làm điều này là kiểm tra xem số lượng của hai tập hợp là một bộ là tập hợp con (không đúng) của tập hợp kia. Tôi nghĩ cách duy nhất có thể xảy ra là nếu họ là những bộ bằng nhau. Mã ví dụ:

HashSet<int> set1 = new HashSet<int>(); 
set1.Add(1); 
set1.Add(2); 
set1.Add(3); 

HashSet<int> set2 = new HashSet<int>(); 
set2.Add(1); 
set2.Add(2); 
set2.Add(3); 

if(set1.Count == set2.Count && set1.IsSubsetOf(set2)) 
{ 
    // do something 
} 

Điều này luôn hoạt động? Có cách nào tốt hơn? Tại sao không HashSet có chức năng public bool IsEqualSetWith()?

+0

Trong khi đó là sự thật mà SetEquals() sẽ làm việc, nó rõ ràng không phải là một giải pháp lý tưởng về OO tốt. Lý tưởng nhất là tôi muốn làm việc với các giao diện như ICollection hoặc IEnumerable . Nó không phải là một số tháp cầu vồng hoàn hảo nhưng rất thiết kế API thực sự xem xét khi bạn đang phát triển một nền tảng cho các nhà phát triển khác để tận dụng. Dù sao, nếu API của tôi chấp nhận ICollection làm đối số tôi muốn có thể gọi .Equals() để so sánh đối số với một số giá trị đã biết. Nếu người gọi cung cấp cho tôi một danh sách và tôi so sánh nó trong phương thức API của tôi với một bộ, (tiếp theo) –

+1

Nó được gọi là IEqualityComparer :) –

+0

Tôi muốn đối tượng đã đặt của mình tìm ra đó là danh sách tôi có và trả về false. Ngược lại, nếu người gọi gọi phương thức của tôi với một tập hợp và nó xảy ra có cùng các phần tử tôi muốn đối tượng đã đặt của tôi gọi SetEquals() bên trong mà không cần phải downcast và sử dụng một phương thức đặc biệt. Nói cách khác, sử dụng đa hình và đóng gói như nó được dạy ở trường. Nó làm tôi giật mình như thế nào thư viện C# có thể bỏ lỡ điều này quá lâu và không ai phàn nàn. –

Trả lời

69

Nhìn vào phương pháp SetEquals.

my_hashset.SetEquals(other); 
+0

Cảm ơn Michael, Tôi không biết làm thế nào tôi hoàn toàn bị mất rằng trong danh sách phương pháp trên MSDN ... –

+21

Xảy ra cho tất cả mọi người cùng một lúc hay cách khác. Tôi không thể tin rằng tôi đánh bại cả Jon Skeet và Marc Gravell trên một câu hỏi .NET. Tôi đoán họ * làm * phải ngủ đôi khi. –

4
IEqualityComparer<HashSet<int>> comp = HashSet<int>.CreateSetComparer(); 
Console.WriteLine("CreateSetComparer set1 == set2 : {0}", comp.Equals(set1, set2)); 
// or 
bool areEqual = HashSet<int>.CreateSetComparer().Equals(set1, set2); 
+0

Điều này rất hữu ích khi bạn cần tạo một từ điển trong đó HashSet được sử dụng làm khóa. – mancze

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