2009-01-30 15 views
36

Estoy tratando de determinar si dos objetos HashSet en .NET 3.5 (C#) son conjuntos iguales, es decir, contienen los mismos valores. Esto parece algo que obviamente uno querría hacer, pero ninguna de las funciones provistas parece brindarle esta información.¿Cómo se determina si dos HashSets son iguales (por valor, no por referencia)?

La forma en que puedo pensar en hacer esto es comprobando si el recuento de los dos conjuntos es igual y un conjunto es un subconjunto (no apropiado) del otro. Creo que la única forma en que puede suceder es si son conjuntos iguales. Código de ejemplo:

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 
} 

¿Esto funcionaría siempre? ¿Hay una mejor manera? ¿Por qué HashSet no tiene una función public bool IsEqualSetWith()?

+0

Si bien es cierto que SetEquals() funcionarían, obviamente no es una solución ideal en términos de buen OO. Idealmente, quiero trabajar con interfaces como ICollection o IEnumerable . No se trata de una torre de marfil perfeccionista, sino de una consideración de diseño de API muy real cuando se está desarrollando una plataforma para que otros desarrolladores aprovechen. De todos modos, si mi API acepta ICollection como argumento, quiero poder llamar a .Equals() para comparar el argumento con algún valor conocido. Si la persona que llama me da una lista y la comparo en mi método API con un conjunto, (cont.) –

+1

Se llama IEqualityComparer :) –

+0

Quiero que mi objeto set adivine que es una lista que tengo y devuelve falso. Por el contrario, si la persona que llama llama a mi método con un conjunto y tiene los mismos elementos, quiero que mi objeto set invoque SetEquals() internamente sin que yo tenga que bajar y usar un método especial. En otras palabras, usa polimorfismo y encapsulación como se enseña en la escuela. Me sorprende cómo la biblioteca C# puede perder esto durante tanto tiempo y nadie se queja. –

Respuesta

69

Mire el método SetEquals.

my_hashset.SetEquals(other); 
+0

Gracias Michael, no sé cómo lo extrañé por completo en la lista de métodos en MSDN ... –

+21

Le sucede a todos en un momento u otro. No puedo creer que haya vencido a Jon Skeet y Marc Gravell en una pregunta de .NET. Supongo que tienen que dormir en algún momento. –

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

Esto es útil cuando, por ejemplo, necesita crear un diccionario donde HashSet se utiliza como clave. – mancze

Cuestiones relacionadas