SortKey Klas

Definitie

Vertegenwoordigt het resultaat van het toewijzen van een tekenreeks aan de sorteersleutel.

public ref class SortKey sealed
public ref class SortKey
public sealed class SortKey
public class SortKey
[System.Serializable]
public class SortKey
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class SortKey
type SortKey = class
[<System.Serializable>]
type SortKey = class
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type SortKey = class
Public NotInheritable Class SortKey
Public Class SortKey
Overname
SortKey
Kenmerken

Voorbeelden

In het volgende voorbeeld wordt de tekenreeks 'llama' vergeleken met behulp van de culturen 'en-US' en 'es-ES' en 'en-USes-ES' en 'es-ES'.

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
*/
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

End Class


'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

In het volgende voorbeeld ziet u hoe u de klasse kunt gebruiken om de SortKey prestaties in een toepassing te verbeteren die veel afhankelijk is van het sorteren en doorzoeken van een grote matrix. In het voorbeeld wordt een niet-geordende matrix met namen gemaakt, die in dit geval 13 elementen bevat. Vervolgens wordt de sorteersleutel van elke naam opgeslagen in een parallelle matrix, die wordt doorgegeven aan de Sort(Array, Array) methode. Het resultaat is een gesorteerde matrix. In het voorbeeld wordt vervolgens in de matrix gezocht naar drie tekenreeksen. Voor elke zoekreeks wordt de methode aangeroepen om de GetSortKey(String, CompareOptions) sorteersleutel van de tekenreeks op te halen en wordt vervolgens de methode aangeroepen om de Array.FindIndex index van die sorteersleutel op te halen in de matrix met sorteersleutels. Omdat de naam- en sorteersleutelmatrices parallel zijn, is de geretourneerde index ook de index van de naam in de names matrix.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      // Define names.
      String[] names= { "Adam", "Ignatius", "Batholomew", "Gregory",
                        "Clement", "Frances", "Harold", "Dalmatius",
                        "Edgar", "John", "Benedict", "Paul", "George" };
      SortKey[] sortKeys = new SortKey[names.Length];
      CompareInfo ci = CultureInfo.CurrentCulture.CompareInfo;

      for (int ctr = 0; ctr < names.Length; ctr++)
         sortKeys[ctr] = ci.GetSortKey(names[ctr], CompareOptions.IgnoreCase);

      // Sort array based on value of sort keys.
      Array.Sort(names, sortKeys);

      Console.WriteLine("Sorted array: ");
      foreach (var name in names)
         Console.WriteLine(name);

      Console.WriteLine();

      String[] namesToFind = { "Paul", "PAUL", "Wilberforce" };

      Console.WriteLine("Searching an array:");
      foreach (var nameToFind in namesToFind) {
         SortKey searchKey = ci.GetSortKey(nameToFind, CompareOptions.IgnoreCase);
         int index = Array.FindIndex(sortKeys, (x) => x.Equals(searchKey));
         if (index >= 0)
            Console.WriteLine("{0} found at index {1}: {2}", nameToFind,
                              index, names[index]);
         else
            Console.WriteLine("{0} not found", nameToFind);
      }
   }
}
// The example displays the following output:
//       Sorted array:
//       Adam
//       Batholomew
//       Benedict
//       Clement
//       Dalmatius
//       Edgar
//       Frances
//       George
//       Gregory
//       Harold
//       Ignatius
//       John
//       Paul
//
//       Searching an array:
//       Paul found at index 12: Paul
//       PAUL found at index 12: Paul
//       Wilberforce not found
Imports System.Globalization

Module Example
   Public Sub Main()
      ' Define names.
      Dim names() As String = { "Adam", "Ignatius", "Batholomew", 
                                "Gregory", "Clement", "Frances",  
                                "Harold", "Dalmatius", "Edgar",    
                                "John", "Benedict", "Paul", "George" } 
      Dim sortKeys(names.Length - 1) As SortKey
      Dim ci As CompareInfo = CultureInfo.CurrentCulture.CompareInfo

      For ctr As Integer = 0 To names.Length - 1
         sortKeys(ctr) = ci.GetSortKey(names(ctr), CompareOptions.IgnoreCase)         
      Next   
      
      ' Sort array based on value of sort keys.
      Array.Sort(names, sortKeys)
      
      Console.WriteLine("Sorted array: ")
      For Each name In names
         Console.WriteLine(name)
      Next          
      Console.WriteLine()
      
      Dim namesToFind() As String = { "Paul", "PAUL", "Wilberforce" }
      
      Console.WriteLine("Searching an array:")
      For Each nameToFind In namesToFind
         Dim searchKey As SortKey = ci.GetSortKey(nameToFind, CompareOptions.IgnoreCase)
         Dim index As Integer = Array.FindIndex(sortKeys, 
                                                Function(x) x.Equals(searchKey)) 
         If index >= 0 Then
            Console.WriteLine("{0} found at index {1}: {2}", nameToFind,
                              index, names(index))
         Else
            Console.WriteLine("{0} not found", nameToFind)
         End If                     
      Next                     
   End Sub
End Module
' The example displays the following output:
'       Sorted array:
'       Adam
'       Batholomew
'       Benedict
'       Clement
'       Dalmatius
'       Edgar
'       Frances
'       George
'       Gregory
'       Harold
'       Ignatius
'       John
'       Paul
'       
'       Searching an array:
'       Paul found at index 12: Paul
'       PAUL found at index 12: Paul
'       Wilberforce not found

Opmerkingen

Een cultuurgevoelige vergelijking van twee tekenreeksen is afhankelijk van elk teken in de tekenreeksen met verschillende categorieën sorteercriteria, waaronder script, alfabetisch, hoofdletters en diakritische gewichten. Een sorteersleutel fungeert als de opslagplaats van deze gewichten voor een bepaalde tekenreeks.

De CompareInfo.GetSortKey methode retourneert een instantie van de SortKey klasse die de cultuurgevoelige toewijzing van tekens in een opgegeven tekenreeks weerspiegelt. De waarde van een SortKey object is de belangrijkste gegevens, die worden geretourneerd door de KeyData eigenschap. Deze sleutelgegevens bestaan uit een reeks bytes die de tekenreeks, cultuurspecifieke sorteerregels en door de gebruiker opgegeven vergelijkingsopties coderen. Een vergelijking met behulp van sorteersleutels bestaat uit een bitsgewijze vergelijking van de bijbehorende sleutelgegevens in elke sorteersleutel. Als u bijvoorbeeld een sorteersleutel maakt door de GetSortKey(String, CompareOptions) methode aan te roepen met een waarde van CompareOptions.IgnoreCase, is een tekenreeksvergelijkingsbewerking die gebruikmaakt van de sorteersleutel niet hoofdlettergevoelig.

Nadat u een sorteersleutel voor een tekenreeks hebt gemaakt, vergelijkt u sorteersleutels door de statische SortKey.Compare methode aan te roepen. Met deze methode wordt een eenvoudige byte-bytevergelijking uitgevoerd, dus het is veel sneller dan de String.Compare of CompareInfo.Compare methode.

Note

U kunt de sorteergewichttabellen downloaden, een set tekstbestanden die informatie bevatten over de tekengewichten die worden gebruikt in sorteer- en vergelijkingsbewerkingen voor Windows-besturingssystemen, de standaardtabel Unicode-sorteringselement, de tabel met sorteergewichten voor Linux en macOS.

Prestatie-overwegingen

Wanneer u een tekenreeksvergelijking uitvoert, leveren de Compare en CompareInfo.Compare methoden dezelfde resultaten op, maar richten ze zich op verschillende scenario's.

Op hoofdlijnen genereert de CompareInfo.Compare-methode de sorteersleutel voor elke tekenreeks, voert de vergelijking uit, verwijdert vervolgens de sorteersleutel, en retourneert het resultaat van de vergelijking. De CompareInfo.Compare methode genereert echter geen volledige sorteersleutel om de vergelijking uit te voeren. In plaats daarvan genereert de methode de sleutelgegevens voor elk tekstelement (dat wil weten, basisteken, surrogaatpaar of tekenreeks combineren) in elke tekenreeks. De methode vergelijkt vervolgens de sleutelgegevens voor de bijbehorende tekstelementen. De bewerking wordt beëindigd zodra het uiteindelijke resultaat van de vergelijking wordt bepaald. Sort sleutelinformatie wordt berekend, maar er wordt geen SortKey-object gemaakt. Deze strategie is economisch in termen van prestaties als beide tekenreeksen eenmaal worden vergeleken, maar duur wordt als dezelfde tekenreeksen vaak worden vergeleken.

De Compare methode vereist het genereren van een SortKey object voor elke tekenreeks voordat de vergelijking wordt uitgevoerd. Deze strategie is duur in termen van prestaties voor de eerste vergelijking vanwege de tijd en het geheugen die zijn geïnvesteerd om de SortKey objecten te genereren. Het wordt echter economisch als dezelfde sorteersleutels vaak worden vergeleken.

Stel dat u een toepassing schrijft waarmee een databasetabel wordt doorzocht naar de rij waarin de indexkolom op basis van tekenreeksen overeenkomt met een opgegeven zoekreeks. De tabel bevat duizenden rijen en het vergelijken van de zoekreeks met de index in elke rij duurt lang. Wanneer de toepassing een rij en de bijbehorende indexkolom opslaat, wordt daarom ook de sorteersleutel voor de index gegenereerd en opgeslagen in een kolom die is toegewezen aan het verbeteren van de zoekprestaties. Wanneer de toepassing zoekt naar een doelrij, wordt de sorteersleutel voor de zoekreeks vergeleken met de sorteersleutel voor de indextekenreeks in plaats van de zoekreeks te vergelijken met de indextekenreeks.

Beveiligingsoverwegingen

De CompareInfo.GetSortKey(String, CompareOptions) methode retourneert een SortKey object met de waarde op basis van een opgegeven tekenreeks en CompareOptions waarde en de cultuur die is gekoppeld aan het onderliggende CompareInfo object. Als een beveiligingsbeslissing afhankelijk is van een tekenreeksvergelijking of casewijziging, moet u de CompareInfo.GetSortKey(String, CompareOptions) methode van de invariante cultuur gebruiken om ervoor te zorgen dat het gedrag van de bewerking consistent is, ongeacht de cultuurinstellingen van het besturingssysteem.

Gebruik de volgende stappen om een sorteersleutel te verkrijgen:

  1. Haal de invariante cultuur op uit de CultureInfo.InvariantCulture eigenschap.

  2. Haal een CompareInfo object op voor de invariante cultuur uit de CultureInfo.CompareInfo eigenschap.

  3. Roep de CompareInfo.GetSortKey(String, CompareOptions) methode aan.

Werken met de waarde van een SortKey object is gelijk aan het aanroepen van de Windows-methode LCMapString met de opgegeven LCMAP_SORTKEY waarde. Voor het SortKey object worden echter de sorteersleutels voor Engelse tekens voorafgegaan door de sorteersleutels voor Koreaanse tekens.

SortKey-objecten kunnen worden geserialiseerd, maar alleen zodat ze AppDomain-objecten kunnen overbrengen. Als een toepassing een SortKey object serialiseert, moet de toepassing alle sorteersleutels opnieuw genereren wanneer er een nieuwe versie van .NET is.

Zie Unicode Technical Standard #10, 'Unicode Collation Algorithm' op de Unicode Consortium-website voor meer informatie over sorteersleutels.

Eigenschappen

Name Description
KeyData

Hiermee haalt u de bytematrix op die het huidige SortKey object vertegenwoordigt.

OriginalString

Hiermee haalt u de oorspronkelijke tekenreeks op die wordt gebruikt om het huidige SortKey object te maken.

Methoden

Name Description
Compare(SortKey, SortKey)

Vergelijkt twee sorteersleutels.

Equals(Object)

Bepaalt of het opgegeven object gelijk is aan het huidige SortKey object.

GetHashCode()

Fungeert als een hash-functie voor het huidige SortKey object dat geschikt is voor hash-algoritmen en gegevensstructuren, zoals een hash-tabel.

GetType()

Hiermee haalt u de Type huidige instantie op.

(Overgenomen van Object)
MemberwiseClone()

Hiermee maakt u een ondiepe kopie van de huidige Object.

(Overgenomen van Object)
ToString()

Retourneert een tekenreeks die het huidige SortKey object vertegenwoordigt.

Van toepassing op

Zie ook