Iată o implementare simplă:
public sealed class MathSet : HashSet, IEquatable>
{
public override int GetHashCode() => this.Select(elt => elt.GetHashCode()).Sum().GetHashCode();
public bool Equals(MathSet obj) => SetEquals(obj);
public override bool Equals(object obj) => Equals(obj as MathSet);
public static bool operator ==(MathSet a, MathSet b) =>
ReferenceEquals(a, null) ? ReferenceEquals(b, null) : a.Equals(b);
public static bool operator !=(MathSet a, MathSet b) => !(a == b);
}
Exemplu de utilizare:
var a = new MathSet { 1, 2, 3 };
var b = new MathSet { 3, 2, 1 };
var c = a.Equals(b); //true
var d = new MathSet> { a, b };//contains one element
var e = a == b; //true
Vedeți această întrebare pentru motivul pentru care această abordare a fost considerată peste HashSet
.