SortVersion Klasse

Definition

Stellt Informationen über die Unicode-Version bereit, die zum Vergleichen und Sortieren von Zeichenfolgen verwendet wird.

public ref class SortVersion sealed : IEquatable<System::Globalization::SortVersion ^>
public sealed class SortVersion : IEquatable<System.Globalization.SortVersion>
[System.Serializable]
public sealed class SortVersion : IEquatable<System.Globalization.SortVersion>
type SortVersion = class
    interface IEquatable<SortVersion>
[<System.Serializable>]
type SortVersion = class
    interface IEquatable<SortVersion>
Public NotInheritable Class SortVersion
Implements IEquatable(Of SortVersion)
Vererbung
SortVersion
Attribute
Implementiert

Beispiele

Das folgende Beispiel enthält einen Teil des Quellcodes aus einer Anwendung, die die SortVersion -Klasse verwendet, um sicherzustellen, dass die nativen Namen von RegionInfo Objekten für das aktuelle System und die aktuelle Kultur ordnungsgemäß sortiert werden. Sie verwendet die BinaryReader - und BinaryWriter -Objekte, um sortierte Daten aus einer Datendatei namens zu speichern und abzurufen, Regions.dat anstatt daten bei jeder Ausführung der Anwendung abzurufen und zu sortieren. Im Beispiel wird zuerst überprüft, ob die Datendatei vorhanden ist. Andernfalls werden die Daten erstellt und das reindex Flag festgelegt, das angibt, dass die Daten aussortiert und erneut gespeichert werden müssen. Andernfalls werden die Daten abgerufen und das gespeicherte SortVersion Objekt mit dem SortVersion -Objekt für die aktuelle Kultur im aktuellen System verglichen. Wenn sie nicht gleich sind oder das reindex Flag zuvor festgelegt wurde, werden die Daten mit datengeflagt. RegionInfo

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Text;

public class Example : IComparer
{
   private const string FILENAME = @".\Regions.dat";

   private struct Region
   {
      internal Region(string id, string name)
      {
         this.Id = id;
         this.NativeName = name;
      }

      public string Id;
      public string NativeName;

      public override string ToString()
      {
         return this.NativeName;
      }
   }

   public static void Main()
   {
      bool reindex = false;

      Region[] regions;
      SortVersion ver = null;

      // If the data has not been saved, create it.
      if (! File.Exists(FILENAME)) {
         regions = GenerateData();
         ver = CultureInfo.CurrentCulture.CompareInfo.Version;
         reindex = true;
      }
      // Retrieve the existing data.
      else {
         regions = RestoreData(out ver);
      }

      // Determine whether the current ordering is valid; if not, reorder.
      if (reindex || ver != CultureInfo.CurrentCulture.CompareInfo.Version) {
         Array.Sort(regions, new Example());
         // Save newly reordered data.
         SaveData(regions);
      }

      // Continue with application...
   }

   private static Region[] GenerateData()
   {
      List<Region> regions = new List<Region>();

      foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures)) {
         if (culture.IsNeutralCulture | culture.Equals(CultureInfo.InvariantCulture))
            continue;

         RegionInfo region = new RegionInfo(culture.Name);
         regions.Add(new Region(region.Name, region.NativeName));
      }
      return regions.ToArray();
   }

   private static Region[] RestoreData(out SortVersion ver)
   {
      List<Region> regions = new List<Region>();

      BinaryReader rdr = new BinaryReader(File.Open(FILENAME, FileMode.Open));

      int sortVer = rdr.ReadInt32();
      Guid sortId = Guid.Parse(rdr.ReadString());
      ver = new SortVersion(sortVer, sortId);

      string id, name;
      while (rdr.PeekChar() != -1) {
         id = rdr.ReadString();
         name = rdr.ReadString();
         regions.Add(new Region(id, name));
      }
      return regions.ToArray();
   }

   private static void SaveData(Region[] regions)
   {
      SortVersion ver = CultureInfo.CurrentCulture.CompareInfo.Version;

      BinaryWriter wrtr = new BinaryWriter(File.Open(FILENAME, FileMode.Create));
      wrtr.Write(ver.FullVersion);
      wrtr.Write(ver.SortId.ToString());

      foreach (var region in regions) {
         wrtr.Write(region.Id);
         wrtr.Write(region.NativeName);
      }
      wrtr.Close();
   }

   public int Compare(object o1, object o2)
   {
        // Assume that all casts succeed.
        Region r1 = (Region) o1;
        Region r2 = (Region) o2;

        return String.Compare(r1.NativeName, r2.NativeName,
                              StringComparison.CurrentCulture);
   }
}
Imports System.Collections
Imports System.Collections.Generic
Imports System.Globalization
Imports System.IO
Imports System.Text

Public Class Example : Implements IComparer
   Private Const FILENAME As String = ".\Regions.dat"
   
   Private Structure Region
      Friend Sub New(id As String, name As String)
         Me.Id = id
         Me.NativeName = name
      End Sub
      
      Dim Id As String
      Dim NativeName As String
      
      Public Overrides Function ToString() As String
         Return Me.NativeName
      End Function
   End Structure
   
   Public Shared Sub Main()
      Dim reindex As Boolean = False
      
      Dim regions() As Region
      Dim ver As SortVersion = Nothing

      ' If the data has not been saved, create it.
      If Not File.Exists(FILENAME) Then 
         regions = GenerateData()
         ver = CultureInfo.CurrentCulture.CompareInfo.Version  
         reindex = True
      ' Retrieve the existing data.
      Else
         regions = RestoreData(ver)
      End If

      ' Determine whether the current ordering is valid; if not, reorder.
      If reindex OrElse ver <> CultureInfo.CurrentCulture.CompareInfo.Version Then 
         Array.Sort(regions, New Example())      
         ' Save newly reordered data.
         SaveData(regions)
      End If
      
      ' Continue with application...
   End Sub

   Private Shared Function GenerateData() As Region()
      Dim regions As New List(Of Region)()

      For Each culture In CultureInfo.GetCultures(CultureTypes.AllCultures)
         If culture.IsNeutralCulture Or culture.Equals(CultureInfo.InvariantCulture) Then Continue For
            
         Dim region As New RegionInfo(culture.Name)
         regions.Add(New Region(region.Name, region.NativeName))
      Next
      Return regions.ToArray()
   End Function
   
   Private Shared Function RestoreData(ByRef ver As SortVersion) As Region()
      Dim regions As New List(Of Region)
      
      Dim rdr As New BinaryReader(File.Open(FILENAME, FileMode.Open))
      
      Dim sortVer As Integer = rdr.ReadInt32
      Dim sortId As Guid = Guid.Parse(rdr.ReadString())
      ver = New SortVersion(sortVer, sortId)
      
      Dim id As String, name As String
      Do While rdr.PeekChar <> -1
         id = rdr.ReadString()
         name = rdr.ReadString()
         regions.Add(New Region(id, name))      
      Loop
      Return regions.ToArray()
   End Function
   
   Private Shared Sub SaveData(regions As Region())
      Dim ver As SortVersion = CultureInfo.CurrentCulture.CompareInfo.Version

      Dim wrtr As New BinaryWriter(File.Open(FILENAME, FileMode.Create))
      wrtr.Write(ver.FullVersion) 
      wrtr.Write(ver.SortId.ToString()) 
      
      For Each region In regions
         wrtr.Write(region.Id)
         wrtr.Write(region.NativeName)
      Next
      wrtr.Close()
   End Sub

   Private Function SortByNativeName(o1 As Object, o2 As Object) As Integer _
           Implements IComparer.Compare
        ' Assume that all conversions succeed.
        Dim r1 As Region = CType(o1, Region)
        Dim r2 As Region = CType(o2, Region)
        
        Return String.Compare(r1.NativeName, r2.NativeName, 
                              StringComparison.CurrentCulture)         
   End Function
End Class

Hinweise

Sortierung und Zeichenfolgenvergleich im .NET Framework

Von .NET Framework 2.0 Service Pack 1 bis .NET Framework 4 enthält jede Version von the.NET Framework Tabellen, die Sortiergewichtungen und Daten zur Zeichenfolgennormalisierung enthalten und auf einer bestimmten Unicode-Version basieren. Im .NET Framework 4.5 hängt das Vorhandensein dieser Tabellen vom Betriebssystem ab:

  • In Windows 7 und früheren Versionen des Windows Betriebssystems werden die Tabellen weiterhin zum Vergleichen und Sortieren von Zeichenfolgen verwendet.

  • Auf Windows 8 delegiert der .NET Framework Zeichenfolgenvergleichs- und Sortiervorgänge an das Betriebssystem.

Folglich kann das Ergebnis eines Zeichenfolgenvergleichs nicht nur von der .NET Framework Version, sondern auch von der Betriebssystemversion abhängen, wie in der folgenden Tabelle gezeigt. Beachten Sie, dass diese Liste der unterstützten Unicode-Versionen lediglich für den Zeichenvergleich und die Sortierung gilt. Sie gilt nicht für die kategorische Klassifizierung von Unicode-Zeichen.

.NET Framework-Version Betriebssystem Unicode-Version
.NET Framework 4 Alle Betriebssysteme Unicode 5.0
.NET Framework Version 4.5 und höher der .NET Framework Windows 7 Unicode 5.0
.NET Framework Version 4.5 und höher der .NET Framework Windows 8 und höher Windows Betriebssystemversionen Unicode 6.0

Bei Windows 8, da die im Zeichenfolgenvergleich und in der Reihenfolge verwendete Unicode-Version von der Version des Betriebssystems abhängt, können sich die Ergebnisse des Zeichenfolgenvergleichs auch bei Anwendungen unterscheiden, die auf einer bestimmten Version der .NET Framework ausgeführt werden.

Sortieren und Zeichenfolgenvergleich in .NET Core

Alle Versionen von .NET Core basieren beim Durchführen von Zeichenfolgenvergleichen auf dem zugrunde liegenden Betriebssystem. Daher hängen die Ergebnisse eines Zeichenfolgenvergleichs oder die Reihenfolge, in der Zeichenfolgen sortiert werden, von der Unicode-Version ab, die vom Betriebssystem beim Durchführen des Vergleichs verwendet wird. Unter Linux und macOS stellen internationale Komponenten für Unicode-Bibliotheken die Implementierung für Vergleichs- und Sortier-APIs bereit.

Verwenden der SortVersion-Klasse

Die SortVersion -Klasse stellt Informationen zur Unicode-Version bereit, die von .NET für Zeichenfolgenvergleiche und -sortierungen verwendet wird. Er ermöglicht Entwicklern das Schreiben von Anwendungen, die Änderungen in der Unicode-Version erkennen und erfolgreich verarbeiten können, die zum Vergleichen und Sortieren der Zeichenfolgen einer Anwendung verwendet wird.

Sie können ein SortVersion -Objekt auf zwei Arten instanziieren:

  • Durch Aufrufen des SortVersion Konstruktors, der ein neues SortVersion -Objekt basierend auf einer Versionsnummer und Sortier-ID instanziiert. Dieser Konstruktor ist am nützlichsten, wenn ein -Objekt aus gespeicherten Daten neu erstellen SortVersion wird.

  • Durch Abrufen des Werts der CompareInfo.Version -Eigenschaft. Diese Eigenschaft stellt Informationen zur Unicode-Version bereit, die von der .NET-Implementierung verwendet wird, auf der die Anwendung ausgeführt wird.

Die SortVersion -Klasse verfügt über zwei Eigenschaften, FullVersion und , die die SortId Unicode-Version und die spezifische Kultur angeben, die für den Zeichenfolgenvergleich verwendet wird. Die FullVersion -Eigenschaft ist ein beliebiger numerischer Wert, der die für den Zeichenfolgenvergleich verwendete Unicode-Version wiedergibt, und die -Eigenschaft ist eine beliebige , SortId die die Kultur Guid widerspiegelt, deren Konventionen für zeichenfolgenvergleiche verwendet werden. Die Werte dieser beiden Eigenschaften sind nur wichtig, wenn Sie zwei SortVersion Objekte mithilfe der Equals -Methode, des Equality -Operators oder des Inequality -Operators vergleichen.

In der Regel verwenden Sie ein SortVersion -Objekt, wenn Sie kulturabhängige, sortierte Zeichenfolgendaten wie Indizes oder Literalzeichenfolgen selbst speichern oder abrufen. Gehen Sie dazu folgendermaßen vor:

  1. Wenn die sortierten Zeichenfolgendaten gespeichert werden, werden auch die FullVersion Eigenschaftswerte und SortId gespeichert.

  2. Wenn die sortierten Zeichenfolgendaten abgerufen werden, können Sie das Objekt, das SortVersion zum Sortieren der Zeichenfolgen verwendet wird, neu erstellen, indem Sie den SortVersion Konstruktor aufrufen.

  3. Dieses neu instanziierte SortVersion Objekt wird mit einem SortVersion -Objekt verglichen, das die Kultur wiedergibt, deren Konventionen zum Anordnen der Zeichenfolgendaten verwendet werden.

  4. Wenn die beiden SortVersion Objekte ungleich sind, müssen die Zeichenfolgendaten neu angeordnet werden.

Dies wird im Beispiel veranschaulicht.

Konstruktoren

SortVersion(Int32, Guid)

Erstellt eine neue Instanz der SortVersion-Klasse.

Eigenschaften

FullVersion

Ruft die vollständige Versionsnummer des SortVersion-Objekts ab.

SortId

Ruft einen globalen eindeutigen Bezeichner für dieses SortVersion-Objekt ab.

Methoden

Equals(Object)

Gibt einen Wert zurück, der angibt, ob diese SortVersion-Instanz gleich einem angegebenen Objekt ist.

Equals(SortVersion)

Gibt einen Wert zurück, der angibt, ob diese SortVersion-Instanz gleich einem angegebenen SortVersion-Objekt ist.

GetHashCode()

Gibt einen Hashcode für diese Instanz zurück.

GetType()

Ruft den Type der aktuellen Instanz ab.

(Geerbt von Object)
MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.

(Geerbt von Object)
ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)

Operatoren

Equality(SortVersion, SortVersion)

Gibt an, ob zwei SortVersion-Instanzen gleich sind.

Inequality(SortVersion, SortVersion)

Gibt an, ob zwei SortVersion-Instanzen ungleich sind.

Gilt für

Siehe auch