SortVersion Classe

Définition

Fournit des informations sur la version Unicode utilisée pour comparer et trier des chaînes.

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)
Héritage
SortVersion
Attributs
Implémente

Exemples

L’exemple suivant contient une partie du code source d’une application qui utilise la SortVersion classe pour vérifier que les noms natifs des RegionInfo objets sont triés correctement pour le système actuel et la culture actuelle. Elle utilise les BinaryReader BinaryWriter objets et pour stocker et récupérer des données ordonnées à partir d’un fichier de données nommé Regions.dat au lieu d’extraire et de trier les données chaque fois que l’application est exécutée. L’exemple commence par vérifier si le fichier de données existe. Si ce n’est pas le cas, il crée les données et définit l' reindex indicateur, qui indique que les données doivent être renouvelées et enregistrées. Sinon, elle récupère les données et compare l’objet enregistré SortVersion avec l' SortVersion objet pour la culture actuelle sur le système actuel. Si elles ne sont pas égales, ou si l' reindex indicateur a été défini précédemment, les données sont reportées 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

Remarques

Tri et comparaison de chaînes dans le .NET Framework

du .NET Framework 2,0 Service Pack 1 au .NET Framework 4, chaque version de the.NET Framework inclut des tables qui contiennent des pondérations de tri et des données sur la normalisation des chaînes et qui sont basées sur une version particulière d’Unicode. dans le .NET Framework 4,5, la présence de ces tables dépend du système d’exploitation :

  • sur Windows 7 et les versions antérieures du système d’exploitation Windows, les tables continuent à être utilisées pour la comparaison et le tri des chaînes.

  • sur Windows 8, le .NET Framework délègue les opérations de comparaison et de tri de chaînes au système d’exploitation.

par conséquent, le résultat d’une comparaison de chaînes peut dépendre non seulement de la version de .NET Framework, mais également de la version du système d’exploitation, comme le montre le tableau suivant. Notez que cette liste de versions d’Unicode prises en charge s’applique uniquement à la comparaison et au tri de caractères ; elle ne s’applique pas à la classification des caractères Unicode par catégorie.

Version du .NET Framework Système d’exploitation Version d’Unicode
.NET Framework 4 Tous les systèmes d’exploitation Unicode 5.0
.NET Framework 4,5 et versions ultérieures du .NET Framework Windows 7 Unicode 5.0
.NET Framework 4,5 et versions ultérieures du .NET Framework Windows 8 et versions ultérieures Windows système d’exploitation Unicode 6.0

sur Windows 8, étant donné que la version d’Unicode utilisée dans les comparaisons de chaînes et le classement dépend de la version du système d’exploitation, les résultats de la comparaison de chaînes peuvent varier même pour les applications qui s’exécutent sur une version spécifique du .NET Framework.

Tri et comparaison de chaînes dans .NET Core

Toutes les versions de .NET Core s’appuient sur le système d’exploitation sous-jacent lors de l’exécution de comparaisons de chaînes. Par conséquent, les résultats d’une comparaison de chaînes ou l’ordre dans lequel les chaînes sont triées dépendent de la version d’Unicode utilisée par le système d’exploitation lors de l’exécution de la comparaison. Sur Linux et macOS, les composants internationaux des bibliothèques Unicode fournissent l’implémentation pour les API de comparaison et de tri.

Utilisation de la classe SortVersion

La SortVersion classe fournit des informations sur la version Unicode utilisée par .net pour la comparaison et le classement des chaînes. Il permet aux développeurs d’écrire des applications capables de détecter et de gérer correctement les modifications dans la version d’Unicode utilisée pour comparer et trier les chaînes d’une application.

Vous pouvez instancier un SortVersion objet de deux manières :

  • En appelant le SortVersion constructeur, qui instancie un nouvel SortVersion objet en fonction d’un numéro de version et d’un ID de tri. Ce constructeur est très utile lors de la recréation SortVersion d’un objet à partir de données enregistrées.

  • En extrayant la valeur de la CompareInfo.Version propriété. Cette propriété fournit des informations sur la version Unicode utilisée par l’implémentation .NET sur laquelle l’application s’exécute.

La SortVersion classe a deux propriétés, FullVersion et SortId , qui indiquent la version Unicode et la culture spécifique utilisée pour la comparaison de chaînes. La FullVersion propriété est une valeur numérique arbitraire qui reflète la version Unicode utilisée pour la comparaison de chaînes, et la SortId propriété est un arbitraire Guid qui reflète la culture dont les conventions sont utilisées pour la comparaison de chaînes. Les valeurs de ces deux propriétés sont importantes uniquement lorsque vous comparez deux objets à l’aide de la SortVersion Equals méthode, de l' Equality opérateur ou de l' Inequality opérateur.

En général, vous utilisez un SortVersion objet lors de l’enregistrement ou de la récupération d’une forme de données de type chaîne dépendante de la culture, telles que des index ou des chaînes littérales. Ce processus implique les étapes suivantes :

  1. Lorsque les données de chaîne triées sont enregistrées, les FullVersion SortId valeurs de propriété et sont également enregistrées.

  2. Lorsque les données de chaîne triées sont récupérées, vous pouvez recréer l' SortVersion objet utilisé pour classer les chaînes en appelant le SortVersion constructeur.

  3. Cet objet récemment instancié SortVersion est comparé à un SortVersion objet qui reflète la culture dont les conventions sont utilisées pour trier les données de chaîne.

  4. Si les deux SortVersion objets ne sont pas égaux, les données de chaîne doivent être réorganisées.

Cet exemple en fournit une illustration.

Constructeurs

SortVersion(Int32, Guid)

Crée une instance de la classe SortVersion.

Propriétés

FullVersion

Obtient le numéro de version complet de l’objet SortVersion.

SortId

Obtient un identificateur global unique pour cet objet SortVersion.

Méthodes

Equals(Object)

Retourne une valeur indiquant si cette instance SortVersion équivaut à un objet spécifié.

Equals(SortVersion)

Retourne une valeur indiquant si cette instance SortVersion équivaut à un objet SortVersion spécifié.

GetHashCode()

Retourne un code de hachage pour cette instance.

GetType()

Obtient le Type de l'instance actuelle.

(Hérité de Object)
MemberwiseClone()

Crée une copie superficielle du Object actuel.

(Hérité de Object)
ToString()

Retourne une chaîne qui représente l'objet actuel.

(Hérité de Object)

Opérateurs

Equality(SortVersion, SortVersion)

Indique si deux instances de SortVersion sont égales.

Inequality(SortVersion, SortVersion)

Indique si deux instances de SortVersion ne sont pas égales.

S’applique à

Voir aussi