SortVersion Klasa

Definicja

Zawiera informacje o wersji unicode używanej do porównywania ciągów kolejności i ich kolejności.

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)
Dziedziczenie
SortVersion
Atrybuty
Implementuje

Przykłady

Poniższy przykład zawiera część kodu źródłowego z aplikacji, która używa SortVersion klasy w celu zapewnienia, że natywne nazwy RegionInfo obiektów są uporządkowane odpowiednio dla bieżącego systemu i bieżącej kultury. Używa BinaryReader obiektów i BinaryWriter do przechowywania i pobierania uporządkowanych danych z pliku danych o nazwie Regions.dat zamiast pobierania i porządkowania danych za każdym razem, gdy aplikacja jest uruchamiana. Przykład najpierw sprawdza, czy plik danych istnieje. Jeśli tak nie jest, tworzy dane i ustawia flagę reindex , która wskazuje, że dane muszą zostać przywrócone i zapisane ponownie. W przeciwnym razie pobiera dane i porównuje zapisany SortVersion obiekt z obiektem SortVersion bieżącej kultury w bieżącym systemie. Jeśli nie są równe lub jeśli flaga reindex została wcześniej ustawiona, oznacza to, że dane są ustawiane 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

Uwagi

Sortowanie i porównywanie ciągów w .NET Framework

Od .NET Framework 2.0 z dodatkiem Service Pack 1 do .NET Framework 4 każda wersja platformy the.NET Zawiera tabele zawierające wagi sortowania i dane normalizacji ciągów oraz oparte na określonej wersji unicode. W .NET Framework 4.5 obecność tych tabel zależy od systemu operacyjnego:

  • W Windows 7 i wcześniejszych wersjach systemu operacyjnego Windows tabele nadal są używane do porównywania i porządkowania ciągów.

  • W Windows 8 .NET Framework deleguje operacje porównywania ciągów i porządkowania do systemu operacyjnego.

W związku z tym wynik porównania ciągów może zależeć nie tylko od wersji .NET Framework, ale także wersji systemu operacyjnego, jak pokazano w poniższej tabeli. Należy pamiętać, że ta lista obsługiwanych wersji Unicode ma zastosowanie tylko do porównania znaków i sortowania; nie ma zastosowania do klasyfikacji znaków Unicode według kategorii.

Wersja programu .NET Framework System operacyjny Wersja Unicode
Program .NET Framework 4 Wszystkie systemy operacyjne Unicode 5.0
.NET Framework 4.5 i nowsze wersje .NET Framework Windows 7 Unicode 5.0
.NET Framework 4.5 i nowsze wersje .NET Framework Windows 8 i nowsze wersje systemu operacyjnego Windows Unicode 6.0

W Windows 8, ponieważ wersja Unicode używana w porównywaniu ciągów i porządkowania zależy od wersji systemu operacyjnego, wyniki porównania ciągów mogą się różnić nawet w przypadku aplikacji działających w określonej wersji .NET Framework.

Porównanie sortowania i ciągów na platformie .NET Core

Wszystkie wersje platformy .NET Core bazują na podstawowym systemie operacyjnym podczas porównywania ciągów. W związku z tym wyniki porównania ciągów lub kolejności sortowania ciągów zależą od wersji Unicode używanej przez system operacyjny podczas porównywania. W systemach Linux i macOS międzynarodowe składniki bibliotek Unicode zapewniają implementację interfejsów API porównywania i sortowania.

Korzystanie z klasy SortVersion

Klasa SortVersion zawiera informacje o wersji Unicode używanej przez platformę .NET do porównywania ciągów i określania kolejności. Umożliwia deweloperom pisanie aplikacji, które mogą wykrywać i pomyślnie obsługiwać zmiany w wersji Unicode używanej do porównywania i sortowania ciągów aplikacji.

Wystąpienie obiektu można utworzyć SortVersion na dwa sposoby:

  • Wywołując SortVersion konstruktor, który tworzy wystąpienie nowego SortVersion obiektu na podstawie numeru wersji i identyfikatora sortowania. Ten konstruktor jest najbardziej przydatny podczas ponownego SortVersion tworzenia obiektu z zapisanych danych.

  • Po pobraniu wartości CompareInfo.Version właściwości. Ta właściwość zawiera informacje o wersji Unicode używanej przez implementację platformy .NET, na której działa aplikacja.

Klasa SortVersion ma dwie właściwości i FullVersion SortId, które wskazują wersję Unicode i konkretną kulturę używaną do porównania ciągów. Właściwość FullVersion jest dowolną wartością liczbową, która odzwierciedla wersję Unicode używaną do porównania ciągów, a SortId właściwość jest dowolną Guid wartością, która odzwierciedla kulturę, której konwencje są używane do porównywania ciągów. Wartości tych dwóch właściwości są ważne tylko w przypadku porównywania dwóch SortVersion obiektów przy użyciu Equals metody, Equality operatora lub Inequality operatora.

Zazwyczaj używasz SortVersion obiektu podczas zapisywania lub pobierania jakiejś formy danych ciągów uporządkowanych według kultury, takich jak indeksy lub ciągi literału. Wymaga to wykonania następujących czynności:

  1. Po zapisaniu FullVersion uporządkowanych danych ciągu wartości właściwości i SortId są również zapisywane.

  2. Po pobraniu uporządkowanych danych ciągu można ponownie utworzyć SortVersion obiekt używany do porządkowania ciągów przez wywołanie konstruktora SortVersion .

  3. Ten nowo utworzony SortVersion obiekt jest porównywany z obiektem, który odzwierciedla kulturę SortVersion , której konwencje są używane do zamawiania danych ciągu.

  4. Jeśli dwa SortVersion obiekty nie są równe, dane ciągu muszą zostać ponownie uporządkowane.

Przykład stanowi ilustrację.

Konstruktory

SortVersion(Int32, Guid)

Tworzy nowe wystąpienie klasy SortVersion.

Właściwości

FullVersion

Pobiera pełny numer SortVersion wersji obiektu.

SortId

Pobiera globalnie unikatowy identyfikator dla tego SortVersion obiektu.

Metody

Equals(Object)

Zwraca wartość wskazującą, czy to SortVersion wystąpienie jest równe określonemu obiektowi.

Equals(SortVersion)

Zwraca wartość wskazującą, czy to SortVersion wystąpienie jest równe określonemu SortVersion obiektowi.

GetHashCode()

Zwraca kod skrótu dla tego wystąpienia.

GetType()

Type Pobiera wartość bieżącego wystąpienia.

(Odziedziczone po Object)
MemberwiseClone()

Tworzy płytkią kopię bieżącego Objectelementu .

(Odziedziczone po Object)
ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)

Operatory

Equality(SortVersion, SortVersion)

Wskazuje, czy dwa SortVersion wystąpienia są równe.

Inequality(SortVersion, SortVersion)

Wskazuje, czy dwa SortVersion wystąpienia nie są równe.

Dotyczy

Zobacz też