Establecer clase con igualdad de conjunto matemático por defecto [cerrado]

HashSet no utiliza establecer semántica de igualdad para la operación de igualdad predeterminada.

var a = new HashSet<int> { 1, 2, 3 };
var b = new HashSet<int> { 3, 2, 1 };

Esto evalúa afalse:

var c = a == b;

mientras que en un sentido matemático, los dos conjuntos son iguales. Por supuesto, podemos usarSetEquals para comparar explícitamente usando la igualdad de conjunto:

var d = a.SetEquals(b); // true

Si creamos un conjunto de estos conjuntos:

var e = new HashSet<HashSet<int>> { a, b };

El resultado contiene dos elementos. Necesitaríamos pasar un comparador personalizado para obtener una semántica establecida para el conjunto primario.

Aquí hay una subclase deHashSet que implementa la semántica establecida por defecto.

public sealed class MathSet<T> : HashSet<T>, IEquatable<MathSet<T>>
{
    public override int GetHashCode() => this.Select(elt => elt.GetHashCode()).Sum().GetHashCode();

    public bool Equals(MathSet<T> obj) => SetEquals(obj);

    public override bool Equals(object obj) => Equals(obj as MathSet<T>);

    public static bool operator ==(MathSet<T> a, MathSet<T> b) =>
        ReferenceEquals(a, null) ? ReferenceEquals(b, null) : a.Equals(b);

    public static bool operator !=(MathSet<T> a, MathSet<T> b) => !(a == b);
}

(Esto se basa en uno que se muestraaquí.)

Ejemplo de uso:

var a = new MathSet<int> { 1, 2, 3 };
var b = new MathSet<int> { 3, 2, 1 };

var c = a.Equals(b);                        // true

var d = new MathSet<MathSet<int>> { a, b }; // contains one element

var e = a == b;                             // true

¿Hay un mejor enfoque?

¿Ya hay una clase similar disponible en una biblioteca en alguna parte?

Respuestas a la pregunta(0)

Su respuesta a la pregunta