Es wird ein verwendet IEqualityComparer<T>(es EqualityComparer<T>.Defaultsei 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>.GetHashCodeund 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>.Equalsder 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 Tselbst 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 Foonicht implementiert IEqualityComparer<Foo>), sondern in einem separaten Typ, der nur für Vergleiche verwendet wird.
- Implementieren Sie die Gleichheit im Typ selbst, indem Sie
GetHashCodeund ü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>.CompareTooder IComparable.CompareTowenn 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