Es wird ein verwendet IEqualityComparer<T>
(es EqualityComparer<T>.Default
sei denn, Sie geben bei der Konstruktion ein anderes an).
Wenn Sie der Menge ein Element hinzufügen, findet es den Hash-Code mithilfe von IEqualityComparer<T>.GetHashCode
und speichert sowohl den Hash-Code als auch das Element (nachdem Sie natürlich überprüft haben, ob sich das Element bereits in der Menge befindet).
Um ein Element nachzuschlagen, wird zuerst der verwendet IEqualityComparer<T>.GetHashCode
, um den Hash-Code zu finden, und dann wird für alle Elemente mit demselben Hash-Code IEqualityComparer<T>.Equals
der Vergleich für die tatsächliche Gleichheit verwendet.
Das heißt, Sie haben zwei Möglichkeiten:
- Übergeben Sie einen Custom
IEqualityComparer<T>
an den Konstruktor. Dies ist die beste Option, wenn Sie das T
selbst nicht ändern können oder wenn Sie eine nicht standardmäßige Gleichheitsrelation wünschen (z. B. "Alle Benutzer mit einer negativen Benutzer-ID werden als gleich angesehen"). Dies wird fast nie auf dem Typ selbst implementiert (dh Foo
nicht implementiert IEqualityComparer<Foo>
), sondern in einem separaten Typ, der nur für Vergleiche verwendet wird.
- Implementieren Sie die Gleichheit im Typ selbst, indem Sie
GetHashCode
und überschreiben Equals(object)
. Im Idealfall auch IEquatable<T>
im Typ implementieren , insbesondere wenn es sich um einen Werttyp handelt. Diese Methoden werden vom Standardgleichheitsvergleich aufgerufen.
Beachten Sie, dass dies im Hinblick auf einen geordneten Vergleich nichts ist - was sinnvoll ist, da es sicherlich Situationen gibt, in denen Sie leicht die Gleichheit angeben können, aber keine Gesamtreihenfolge. Dies ist im Dictionary<TKey, TValue>
Grunde alles das Gleiche wie .
Wenn Sie eine Menge möchten, die die Reihenfolge anstelle von Gleichheitsvergleichen verwendet, sollten Sie sie SortedSet<T>
aus .NET 4 verwenden, mit der Sie eine IComparer<T>
anstelle einer angeben können IEqualityComparer<T>
. Dies wird verwendet IComparer<T>.Compare
- was an IComparable<T>.CompareTo
oder IComparable.CompareTo
wenn Sie verwenden delegieren Comparer<T>.Default
.
IEqualityComparer<T>
im Konstruktor hinzu oder implementieren Sie sie in der Klassea
. msdn.microsoft.com/en-us/library/bb301504(v=vs.110).aspx