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&nbsp;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&nbsp;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?