Vergleiche und Sortierungen innerhalb von Sammlungen

Die System.Collections-Klassen führen bei nahezu allen Vorgängen zur Verwaltung von Auflistungen Vergleiche durch, sei es bei der Suche nach zu entfernenden Elementen oder bei der Rückgabe eines Schlüssel-Wert-Paars.

Auflistungen verwenden in der Regel einen Gleichheitsvergleich und/oder einen Reihenfolgenvergleich. Für Vergleiche werden zwei Konstrukte verwendet.

Durchführen von Gleichheitsüberprüfungen

Methoden wie Contains, IndexOf, LastIndexOfund Remove verwenden einen Gleichheitsvergleich für die Elemente der Auflistung. Wenn die Auflistung generisch ist, werden die Elemente anhand der folgenden Richtlinien auf Gleichheit hin verglichen:

  • Wenn Typ T die generische Schnittstelle IEquatable<T> implementiert, dann ist der Gleichheitsvergleich die Equals -Methode dieser Schnittstelle.

  • Wenn der Typ T IEquatable<T>nicht implementiert, wird Object.Equals verwendet.

Darüber hinaus akzeptieren einige Konstruktorüberladungen für Wörterbuchauflistungen eine IEqualityComparer<T> -Implementierung, die zum Vergleichen von Schlüsseln auf Gleichheit hin verwendet wird. Ein Beispiel dafür finden Sie unter Dictionary<TKey,TValue>.Dictionary<TKey,TValue> -Konstruktor.

Festlegen der Sortierreihenfolge

Methoden, wie BinarySearch und Sort , verwenden einen Reihenfolgenvergleich für Elemente der Auflistung. Die Vergleiche können zwischen Elementen in der Auflistung oder zwischen einem Element und einem angegebenen Wert durchgeführt werden. Für den Vergleich von Objekten gibt es die Konzepte default comparer und explicit comparer.

Der Standardvergleich beruht auf dem Vergleich von mindestens einem Objekt, um die IComparable -Schnittstelle zu implementieren. Es ist empfehlenswert, IComparable in allen Klassen zu implementieren, die als Werte in einer Listenauflistung oder als Schlüssel in einer Wörterbuchauflistung verwendet werden. Bei einer generischen Auflistung wird der Gleichheitsvergleich gemäß dem Folgenden bestimmt:

  • Wenn Typ T die generische Schnittstelle System.IComparable<T> implementiert, dann ist der Standardvergleich die IComparable<T>.CompareTo(T) -Methode dieser Schnittstelle.

  • Wenn Typ T die nicht generische Schnittstelle System.IComparable implementiert, dann ist der Standardvergleich die IComparable.CompareTo(Object) -Methode dieser Schnittstelle.

  • Wenn Typ T keine der Schnittstellen implementiert, gibt es keinen Standardvergleich, und ein Vergleich oder ein Vergleichsdelegat muss explizit angegeben werden.

Um explizite Vergleiche zu ermöglichen, akzeptieren einige Methoden eine IComparer -Implementierung als Parameter. Beispiel: Die List<T>.Sort -Methode akzeptiert eine System.Collections.Generic.IComparer<T> -Implementierung.

Die aktuelle Kultureinstellung des Systems kann sich auf die Vergleichs- und Sortiervorgänge innerhalb einer Auflistung auswirken. Standardmäßig sind die Vergleichs- und Sortiervorgänge in den Auflistungen -Klassen kulturabhängig. Um die Kultureinstellung zu ignorieren und daher konsistente Vergleichs- und Sortierergebnisse zu erhalten, verwenden Sie InvariantCulture mit Memberüberladungen, die CultureInfoakzeptieren. Weitere Informationen finden Sie unter Performing Culture-Insensitive String Operations in Collections und Performing Culture-Insensitive String Operations in Arrays.

Beispiel für Gleichheit und Sortierung

Der folgende Code zeigt eine Implementierung von IEquatable<T> und IComparable<T> für ein einfaches Geschäftsobjekt. Wenn das Objekt in einer Liste gespeichert und sortiert wird, sehen Sie darüber hinaus, dass durch den Aufruf der Sort()-Methode der Standardvergleich für den Part-Typ verwendet wird und die Sort(Comparison<T>)-Methode mit einer anonymen Methode implementiert wird.

[!code-csharpSystem.Collections.Generic.List.Sort#1] [!code-vbSystem.Collections.Generic.List.Sort#1]

Siehe auch

IComparer
IEquatable<T>
IComparer<T>
IComparable
IComparable<T>