SortKey-Klasse
Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.
Ein kulturspezifischer Vergleich zweier Zeichenfolgen hängt davon ab, dass jedem Zeichen in den Zeichenfolgen mehrere Sortiergewichtungskategorien zugeordnet sind, darunter nach Skript, alphabetischer Folge, Groß-/Kleinschreibung und diakritischer Gewichtung. Ein Sortierschlüssel dient als Repository für diese Gewichtungen für eine bestimmte Zeichenfolge.
Die Methode CompareInfo.GetSortKey gibt eine Instanz der SortKey-Klasse zurück, die die kulturabhängige Zuordnung von Zeichen in einer angegebenen Zeichenfolge widerspiegelt. Der Wert eines SortKey-Objekts sind seine Schlüsseldaten, die von der Eigenschaft KeyData zurückgegeben werden. Diese Schlüsseldaten bestehen aus einer Reihe von Bytes, die die Zeichenfolge, kulturspezifischen Sortierregeln und benutzerseitig angegebenen Vergleichsoptionen codieren. Ein Vergleich mit Sortierschlüsseln besteht aus einem bitweisen Vergleich der entsprechenden Schlüsseldaten in jedem Sortierschlüssel. Wenn Sie etwa einen Sortierschlüssel erstellen, indem Sie die Methode GetSortKey(String, CompareOptions) mit dem Wert CompareOptions.IgnoreCase aufrufen, wird bei einem Vorgang zum Zeichenfolgenvergleich, der den Sortierschlüssel verwendet, die Groß-/Kleinschreibung nicht beachtet.
Nachdem Sie einen Sortierschlüssel für eine Zeichenfolge erstellt haben, vergleichen Sie Sortierschlüssel, indem Sie die statische Methode SortKey.Compare aufrufen. Diese Methode führt einen einfachen Byte-pro-Byte-Vergleich durch und ist dadurch wesentlich schneller als die Methode String.Compare oder CompareInfo.Compare.
Hinweis
Sie können die aus mehreren Textdateien bestehenden Sortiergewichtungstabellen herunterladen. Diese Textdateien enthalten Informationen zur Gewichtung der Zeichen, die bei Sortier- und Vergleichsvorgängen unter Windows-Betriebssystemen verwendet werden, sowie die Tabelle mit Standardwerten für die Sortierung von Elementen, die Sortiergewichtungstabelle für Linux und macOS.
Überlegungen zur Leistung
Beim Durchführen eines Zeichenfolgenvergleichs führen die Methoden Compare und CompareInfo.Compare zu denselben Ergebnissen, sie sind jedoch für unterschiedliche Szenarien vorgesehen.
Im Allgemeinen generiert die Methode CompareInfo.Compare den Sortierschlüssel für jede Zeichenfolge, führt den Vergleich durch, verwirft dann den Sortierschlüssel und gibt das Ergebnis des Vergleichs zurück. Die Methode CompareInfo.Compare generiert jedoch tatsächlich keinen gesamten Sortierschlüssel, um den Vergleich auszuführen. Stattdessen generiert die Methode die Schlüsseldaten für jedes Textelement (d. h. Basiszeichen, Ersatzzeichenpaar oder kombinierte Zeichenfolge) in jeder Zeichenfolge. Die Methode vergleicht dann die Schlüsseldaten für die entsprechenden Textelemente. Der Vorgang wird beendet, sobald das endgültige Ergebnis des Vergleichs ermittelt wurde. Sortierschlüsselinformationen werden berechnet, es wird jedoch kein SortKey-Objekt erstellt. Diese Strategie ist hinsichtlich der Leistung günstig, wenn beide Zeichenfolgen einmal verglichen werden, wird aber teuer, wenn dieselben Zeichenfolgen mehrmals verglichen werden.
Für die Methode Compare ist die Generierung eines SortKey-Objekts für jede Zeichenfolge erforderlich, bevor der Vergleich ausgeführt wird. Diese Strategie ist für den ersten Vergleich aufgrund des Zeit- und Speicheraufwands für die Erzeugung der SortKey-Objekte hinsichtlich der Leistung teuer. Sie wird jedoch günstig, wenn dieselben Sortierschlüssel mehrmals verglichen werden.
Angenommen, Sie schreiben eine Anwendung, die eine Datenbanktabelle nach der Zeile durchsucht, in der die zeichenfolgenbasierte Indexspalte mit einer angegebenen Suchzeichenfolge übereinstimmt. Die Tabelle enthält Tausende von Zeilen, und der Vergleich der Suchzeichenfolge mit dem Index in jeder Zeile dauert lange. Wenn die Anwendung also eine Zeile und ihre Indexspalte speichert, generiert und speichert sie auch den Sortierschlüssel für den Index in einer Spalte, die zur Verbesserung der Suchleistung dient. Wenn die Anwendung nach einer Zielzeile sucht, vergleicht sie den Sortierschlüssel für die Suchzeichenfolge mit dem Sortierschlüssel für die Indexzeichenfolge, anstatt die Suchzeichenfolge mit der Indexzeichenfolge zu vergleichen.
Sicherheitshinweise
Die Methode CompareInfo.GetSortKey(String, CompareOptions) gibt ein SortKey-Objekt mit dem Wert basierend auf einer angegebenen Zeichenkette und dem CompareOptions-Wert sowie die mit dem zugrunde liegenden CompareInfo-Objekt zugeordnete Kultur zurück. Wenn eine Sicherheitsentscheidung von einem Zeichenfolgenvergleich oder einer Änderung von Groß-/Kleinschreibung abhängt, sollten Sie die Methode CompareInfo.GetSortKey(String, CompareOptions) der invarianten Kultur verwenden. So können Sie sicherstellen, dass das Verhalten des Vorgangs konsistent ist, unabhängig von den Kultureinstellungen des Betriebssystems.
Führen Sie die folgenden Schritte aus, um einen Sortierschlüssel abzurufen:
Rufen Sie die invariante Kultur aus der CultureInfo.InvariantCulture-Eigenschaft ab.
Rufen Sie ein CompareInfo-Objekt für die invariante Kultur aus der CultureInfo.CompareInfo-Eigenschaft ab.
Rufen Sie die CompareInfo.GetSortKey(String, CompareOptions)-Methode auf.
Die Verwendung des Werts eines SortKey-Objekts entspricht dem Aufrufen der Windows-Methode LCMapString
mit dem angegebenen LCMAP_SORTKEY-Wert. Für das SortKey-Objekt stehen die Sortierschlüssel für englische Zeichen jedoch vor den Sortierschlüsseln für koreanische Zeichen.
SortKey-Objekte können serialisiert werden, allerdings nur so, dass sie AppDomain-Objekte kreuzen können. Wenn eine Anwendung ein SortKey Objekt serialisiert, muss die Anwendung alle Sortierschlüssel neu generieren, wenn eine neue Version von .NET vorhanden ist.
Weitere Informationen zu Sortierschlüsseln finden Sie unter „Unicode Technical Standard #10: Unicode Collation Algorithm“ auf der Website des Unicode-Konsortiums.