2009-01-30 13 views
36

Próbuję określić, czy dwa obiekty HashSet w .NET 3.5 (C#) są równe zestawy, tj. zawierają te same wartości. Wydaje się, że jest to coś, co oczywiście chciałoby się zrobić, ale żadna z dostarczonych funkcji nie wydaje się dostarczać tych informacji.Jak określić, czy dwa HashSety są równe (według wartości, a nie według odwołania)?

Sposób, w jaki mogę to zrobić, polega na sprawdzeniu, czy liczba dwóch zestawów jest równa i jeden zestaw jest podzbiorem (niewłaściwy) drugiego. Myślę, że jedynym sposobem, który może się zdarzyć, jest to, że są to równe zbiory. Przykładowy kod:

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 
} 

Czy to zawsze zadziała? Czy istnieje lepszy sposób? Dlaczego funkcja HashSet ma funkcję public bool IsEqualSetWith()?

+0

Chociaż prawdą jest, że SetEquals() będzie działać, to nie jest oczywiście idealnym rozwiązaniem w warunkach dobrej OO. Idealnie chciałbym pracować z interfejsami takimi jak ICollection lub IEnumerable . To nie jest jakaś perfekcyjna wieża z kości słoniowej, ale bardzo realna konstrukcja interfejsu API, gdy tworzysz platformę, na której inni deweloperzy mogą się rozwijać. W każdym razie, jeśli mój interfejs API akceptuje jako argument ICollection , chcę móc wywołać funkcję .Equals() w celu porównania argumentu z pewną znaną wartością. Jeśli wywołujący poda mi listę i porównuję ją w mojej metodzie API z zestawem, (kontynuacja) –

+1

Nazywa się to IEqualityComparer :) –

+0

Chcę, aby mój obiekt set wyliczył, że jest to lista, którą mam i zwraca false. I odwrotnie, jeśli wywołujący wywołuje moją metodę za pomocą zestawu i zdarza się, że ma te same elementy, które chcę, aby mój obiekt zestawu wywoływał wewnętrznie funkcję SetEquals() bez konieczności odrzucania i używania specjalnej metody. Innymi słowy, używaj polimorfizmu i enkapsulacji, tak jak to uczy się w szkole. To szokuje mnie, że biblioteka C# może tęsknić za tym tak długo i nikt nie narzeka. –

Odpowiedz

69

Spójrz na metodę SetEquals.

my_hashset.SetEquals(other); 
+0

Dzięki Michael, nie wiem, jak całkowicie przegapiłem to na liście metod w MSDN ... –

+21

Zdarza się każdemu w tym samym czasie. Po prostu nie mogę uwierzyć, że pokonałem zarówno Jona Skeeta, jak i Marca Gravella na pytanie .NET. Myślę, że oni * czasami * muszą spać. –

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

Jest to przydatne, gdy na przykład trzeba utworzyć słownik, w którym HashSet jest używany jako klucz. – mancze

Powiązane problemy