SortKey-Klasse
Stellt das Ergebnis der Zuordnung einer Zeichenfolge zum zugehörigen Sortierschlüssel dar.
Namespace: System.Globalization
Assembly: mscorlib (in mscorlib.dll)
Syntax
'Declaration
<SerializableAttribute> _
<ComVisibleAttribute(True)> _
Public Class SortKey
'Usage
Dim instance As SortKey
[SerializableAttribute]
[ComVisibleAttribute(true)]
public class SortKey
[SerializableAttribute]
[ComVisibleAttribute(true)]
public ref class SortKey
/** @attribute SerializableAttribute() */
/** @attribute ComVisibleAttribute(true) */
public class SortKey
SerializableAttribute
ComVisibleAttribute(true)
public class SortKey
Hinweise
Ein Vergleich von zwei Zeichenfolgen, bei dem die Kulturen berücksichtigt werden, hängt davon ab, dass jedes Zeichen in der Zeichenfolge mehrere Sortiergewichtungskategorien aufweist, z. B. Schriftsystem, alphabetische Folge, Groß-/Kleinschreibung und diakritische Zeichen. Als Repository für diese Gewichtungen für eine bestimmte Zeichenfolge fungiert ein Sortierschlüssel. Genauer gesagt ist der Wert eines SortKey-Objekts Schlüsseldaten. Diese bestehen aus einer Reihe von Bytes, mit denen die Zeichenfolge selbst, kulturabhängige Sortierregeln und vom Benutzer angegebene Vergleichsoptionen codiert sind. Ein Vergleich unter Verwendung von Sortierschlüsseln besteht aus einem bitweisen Vergleich der entsprechenden Schlüsseldaten in jedem Sortierschlüssel.
Überlegungen zur Leistung
Beim Durchführen eines Zeichenfolgenvergleichs ergeben die Compare-Methode und die System.Globalization.CompareInfo.Compare-Methode dieselben Ergebnisse.
Im Wesentlichen generiert die System.Globalization.CompareInfo.Compare-Methode den Sortierschlüssel für jede Zeichenfolge, führt den Vergleich durch, verwirft anschließend den Sortierschlüssel und gibt dann das Ergebnis des Vergleichs zurück. Tatsächlich generiert die System.Globalization.CompareInfo.Compare-Methode jedoch nicht zuerst einen vollständigen Sortierschlüssel und führt erst dann den Vergleich aus. Stattdessen generiert die Methode die Schlüsseldaten für jedes Textelement (also Basiszeichen, Ersatzzeichenpaar oder Kombinationszeichensequenz) in jeder Zeichenfolge und vergleicht dann die Schlüsseldaten für die entsprechenden Textelemente. Der Vorgang wird beendet, sobald das endgültige Ergebnis des Vergleiches ermittelt wurde. Die Sortierschlüssel werden berechnet, es wird jedoch kein SortKey-Objekt erstellt. Dieses Verfahren ist effizient, sofern beide Zeichenfolgen nur einmal verglichen werden. Wenn dieselben Zeichenfolgen mehrmals verglichen werden, ist dieses Verfahren jedoch aufwendig.
Bei der Compare-Methode muss vor dem Vergleich ein SortKey-Objekt für jede Zeichenfolge generiert werden. Vom Standpunkt der Leistung ist dieses Verfahren beim ersten Vergleich aufwändig, weil Zeit und Speicher zum Erstellen der SortKey-Objekte genutzt werden. Wenn dieselben Sortierschlüssel jedoch mehrmals verglichen werden, ist dieses Verfahren effizient.
Angenommen, Sie schreiben eine Anwendung, die eine Datenbanktabelle nach der Zeile durchsucht, deren zeichenfolgenbasierte Indexspalte einer angegebenen Suchzeichenfolge entspricht. Die Tabelle enthält Hunderttausende Zeilen, und ein Vergleich der Suchzeichenfolge mit dem Index jeder Zeile würde übermäßig lange dauern. Stattdessen generieren Sie beim Speichern einer Zeile und der entsprechenden Indexspalte auch den Sortierschlüssel für den Index und speichern ihn in einer Spalte, deren Zweck die Steigerung der Suchleistung ist. Wenn Sie jetzt nach einer bestimmten Zeile suchen, vergleicht die Anwendung nicht mehr die Suchzeichenfolge mit der Indexzeichenfolge, sondern den Sortierschlüssel der Suchzeichenfolge mit dem Sortierschlüssel der Indexzeichenfolge.
Sicherheitsüberlegungen
Die CompareInfo.GetSortKey(String,CompareOptions)-Methode gibt ein SortKey-Objekt zurück, dessen Wert auf einer angegebenen Zeichenfolge, einem CompareOptions-Wert und der dem zugrunde liegenden CompareInfo-Objekt zugeordneten Kultur beruht. Wenn eine Sicherheitsentscheidung von einem Zeichenfolgenvergleich oder einer Änderung der Groß-/Kleinschreibung abhängt, stellen Sie mithilfe der CompareInfo.GetSortKey(String,CompareOptions)-Methode der invarianten Kultur sicher, dass das Verhalten des Vorgangs ungeachtet der Kultureinstellungen des Systems konsistent ist.
Gehen Sie folgendermaßen vor, um auf die GetSortKey-Methode zuzugreifen:
Verwenden Sie die CultureInfo.InvariantCulture-Eigenschaft, um die invariante Kultur abzurufen.
Verwenden Sie die CompareInfo-Eigenschaft der invarianten Kultur, um ein CompareInfo-Objekt abzurufen.
Verwenden Sie die GetSortKey-Methode des CompareInfo-Objekts.
Der Wert eines SortKey-Objekts entspricht einem Aufruf der LCMapString-Methode der Windows-API mit dem LCMAP_SORTKEY-Flag. Im Gegensatz zu LCMapString sind jedoch die Sortierschlüssel für englische Zeichen den Sortierschlüsseln für koreanische Zeichen vorangestellt.
Weitere Informationen über Sortierschlüssel finden Sie im Unicode Technical Standard Nr. 10, "Unicode Collation Algorithm", auf der Unicode-Homepage (nur auf Englisch verfügbar).
Beispiel
Im folgenden Codebeispiel wird die Zeichenfolge "llama" unter Verwendung der Kulturen en-US und es-ES sowie der Kulturen en-US und es-ES mit traditioneller Sortierung verglichen.
Imports System
Imports System.Globalization
Public Class SamplesSortKey
Public Shared Sub Main()
' Creates a SortKey using the en-US culture.
Dim myComp_enUS As CompareInfo = New CultureInfo("en-US", False).CompareInfo
Dim mySK1 As SortKey = myComp_enUS.GetSortKey("llama")
' Creates a SortKey using the es-ES culture with international sort.
Dim myComp_esES As CompareInfo = New CultureInfo("es-ES", False).CompareInfo
Dim mySK2 As SortKey = myComp_esES.GetSortKey("llama")
' Creates a SortKey using the es-ES culture with traditional sort.
Dim myComp_es As CompareInfo = New CultureInfo(&H40A, False).CompareInfo
Dim mySK3 As SortKey = myComp_es.GetSortKey("llama")
' Compares the en-US SortKey with each of the es-ES SortKey objects.
Console.WriteLine("Comparing ""llama"" in en-US and in es-ES with international sort : {0}", SortKey.Compare(mySK1, mySK2))
Console.WriteLine("Comparing ""llama"" in en-US and in es-ES with traditional sort : {0}", SortKey.Compare(mySK1, mySK3))
End Sub 'Main
End Class 'SamplesSortKey
'This code produces the following output.
'
'Comparing "llama" in en-US and in es-ES with international sort : 0
'Comparing "llama" in en-US and in es-ES with traditional sort : -1
using System;
using System.Globalization;
public class SamplesSortKey {
public static void Main() {
// Creates a SortKey using the en-US culture.
CompareInfo myComp_enUS = new CultureInfo("en-US",false).CompareInfo;
SortKey mySK1 = myComp_enUS.GetSortKey( "llama" );
// Creates a SortKey using the es-ES culture with international sort.
CompareInfo myComp_esES = new CultureInfo("es-ES",false).CompareInfo;
SortKey mySK2 = myComp_esES.GetSortKey( "llama" );
// Creates a SortKey using the es-ES culture with traditional sort.
CompareInfo myComp_es = new CultureInfo(0x040A,false).CompareInfo;
SortKey mySK3 = myComp_es.GetSortKey( "llama" );
// Compares the en-US SortKey with each of the es-ES SortKey objects.
Console.WriteLine( "Comparing \"llama\" in en-US and in es-ES with international sort : {0}", SortKey.Compare( mySK1, mySK2 ) );
Console.WriteLine( "Comparing \"llama\" in en-US and in es-ES with traditional sort : {0}", SortKey.Compare( mySK1, mySK3 ) );
}
}
/*
This code produces the following output.
Comparing "llama" in en-US and in es-ES with international sort : 0
Comparing "llama" in en-US and in es-ES with traditional sort : -1
*/
using namespace System;
using namespace System::Globalization;
int main()
{
// Creates a SortKey using the en-US culture.
CultureInfo^ MyCI = gcnew CultureInfo( "en-US",false );
CompareInfo^ myComp_enUS = MyCI->CompareInfo;
SortKey^ mySK1 = myComp_enUS->GetSortKey( "llama" );
// Creates a SortKey using the es-ES culture with international sort.
MyCI = gcnew CultureInfo( "es-ES",false );
CompareInfo^ myComp_esES = MyCI->CompareInfo;
SortKey^ mySK2 = myComp_esES->GetSortKey( "llama" );
// Creates a SortKey using the es-ES culture with traditional sort.
MyCI = gcnew CultureInfo( 0x040A,false );
CompareInfo^ myComp_es = MyCI->CompareInfo;
SortKey^ mySK3 = myComp_es->GetSortKey( "llama" );
// Compares the en-US SortKey with each of the es-ES SortKey objects.
Console::WriteLine( "Comparing \"llama\" in en-US and in es-ES with international sort : {0}", SortKey::Compare( mySK1, mySK2 ) );
Console::WriteLine( "Comparing \"llama\" in en-US and in es-ES with traditional sort : {0}", SortKey::Compare( mySK1, mySK3 ) );
}
/*
This code produces the following output.
Comparing S"llama" in en-US and in es-ES with international sort : 0
Comparing S"llama" in en-US and in es-ES with traditional sort : -1
*/
import System.*;
import System.Globalization.*;
public class SamplesSortKey
{
public static void main(String[] args)
{
// Creates a SortKey using the en-US culture.
CompareInfo myComp_enUS =
(new CultureInfo("en-US", false)).get_CompareInfo();
SortKey mySK1 = myComp_enUS.GetSortKey("llama");
// Creates a SortKey using the es-ES culture with international sort.
CompareInfo myComp_esES =
(new CultureInfo("es-ES", false)).get_CompareInfo();
SortKey mySK2 = myComp_esES.GetSortKey("llama");
// Creates a SortKey using the es-ES culture with traditional sort.
CompareInfo myComp_es =
(new CultureInfo(0x40A, false)).get_CompareInfo();
SortKey mySK3 = myComp_es.GetSortKey("llama");
// Compares the en-US SortKey with each of the es-ES SortKey objects.
Console.WriteLine("Comparing \"llama\" in en-US and in es-ES with"
+ " international sort : {0}",
System.Convert.ToString( SortKey.Compare(mySK1, mySK2)));
Console.WriteLine("Comparing \"llama\" in en-US and in es-ES with"
+ " traditional sort : {0}",
System.Convert.ToString( SortKey.Compare(mySK1, mySK3)));
} //main
} //SamplesSortKey
/*
This code produces the following output.
Comparing "llama" in en-US and in es-ES with international sort : 0
Comparing "llama" in en-US and in es-ES with traditional sort : -1
*/
Vererbungshierarchie
System.Object
System.Globalization.SortKey
Threadsicherheit
Alle öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.
Plattformen
Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.
Versionsinformationen
.NET Framework
Unterstützt in: 2.0, 1.1, 1.0
Siehe auch
Referenz
SortKey-Member
System.Globalization-Namespace
CompareInfo.GetSortKey
KeyData