SortVersion クラス

定義

文字列の比較および並べ替えに使用される Unicode のバージョンに関する情報を取得します。

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)
継承
SortVersion
属性
実装

次の例には、クラスを使用 SortVersion するアプリケーションのソース コードの一部が含まれており、オブジェクトのネイティブ名が現在のシステムと現在の RegionInfo カルチャに適切に並べ替えられています。 アプリケーションを実行するたびにデータをBinaryReaderBinaryWriter取得して並べ替えるのではなく、並べ替えられたRegions.datデータ ファイルを格納して取得するオブジェクトを使用します。 この例では最初に、データ ファイルが存在するかどうかを確認します。 そうでない場合は、データを作成し、フラグを reindex 設定します。このフラグは、データを再び取得して保存する必要があることを示します。 それ以外の場合は、データを取得し、保存 SortVersion されたオブジェクトと現在の SortVersion システム上の現在のカルチャのオブジェクトを比較します。 それらが等しくない場合、またはフラグが reindex 以前に設定されていた場合は、データを使用します 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

注釈

.NET Frameworkでの並べ替えと文字列の比較

.NET Framework 2.0 Service Pack 1 から .NET Framework 4 まで、the.NET Framework の各バージョンには、文字列正規化に関する並べ替えの重みとデータを含み、特定のバージョンの Unicode に基づくテーブルが含まれています。 .NET Framework 4.5 では、これらのテーブルの存在はオペレーティング システムによって異なります。

  • Windows オペレーティング システムWindows 7 以前のバージョンでは、文字列の比較と順序付けに引き続きテーブルが使用されます。

  • Windows 8では、.NET Frameworkは文字列の比較操作と順序付け操作をオペレーティング システムに委任します。

その結果、次の表に示すように、文字列比較の結果は、.NET Frameworkバージョンだけでなく、オペレーティング システムのバージョンにも依存する可能性があります。 サポートされている Unicode バージョンの一覧は、文字の比較と並べ替えに対してのみ適用されます。カテゴリ別での Unicode 文字の分類には適用されません。

.NET Framework のバージョン オペレーティング システム Unicode バージョン
.NET Framework 4 すべてのオペレーティング システム Unicode 5.0
.NET Framework 4.5 以降のバージョンの.NET Framework Windows 7 Unicode 5.0
.NET Framework 4.5 以降のバージョンの.NET Framework オペレーティング システムのバージョンWindows Windows 8以降 Unicode 6.0

Windows 8では、文字列の比較と順序付けに使用される Unicode のバージョンはオペレーティング システムのバージョンによって異なるため、特定のバージョンの.NET Frameworkで実行されるアプリケーションでも、文字列比較の結果が異なる場合があります。

.NET Core での並べ替えと文字列の比較

.NET Core のすべてのバージョンは、文字列比較を実行するときに基になるオペレーティング システムに依存します。 したがって、文字列比較の結果または文字列の並べ替え順序は、比較を実行するときにオペレーティング システムで使用される Unicode のバージョンによって異なります。 Linux および macOS では、 Unicode ライブラリ用の国際コンポーネント によって、比較 API と並べ替え API の実装が提供されます。

SortVersion クラスの使用

このクラスは SortVersion 、文字列の比較と順序付けに .NET で使用される Unicode バージョンに関する情報を提供します。 これにより、開発者は、アプリケーションの文字列を比較および並べ替えるために使用される Unicode のバージョンの変更を検出して正常に処理できるアプリケーションを作成できます。

オブジェクトは、次の SortVersion 2 つの方法でインスタンス化できます。

  • バージョン番号と並べ替え ID に基づいて新しいSortVersionオブジェクトをインスタンス化するコンストラクターを呼び出SortVersionします。 このコンストラクターは、保存されたデータからオブジェクトを SortVersion 再作成するときに最も便利です。

  • プロパティの CompareInfo.Version 値を取得します。 このプロパティは、アプリケーションが実行されている .NET 実装で使用される Unicode バージョンに関する情報を提供します。

このSortVersionクラスには 2 つのプロパティがありSortIdFullVersion Unicode バージョンと文字列比較に使用される特定のカルチャを示します。 この FullVersion プロパティは、文字列比較に使用される Unicode バージョンを反映する任意の数値であり SortId 、このプロパティは、文字列比較に使用される規則を持つカルチャを反映する任意 Guid の値です。 これら 2 つのプロパティの値は、メソッド、演算子、またはInequality演算子をEquals使用して 2 つのSortVersionオブジェクトをEquality比較する場合にのみ重要です。

通常、オブジェクトは SortVersion 、インデックスやリテラル文字列自体など、カルチャに依存する順序付けされた文字列データの形式を保存または取得するときに使用します。 この場合、次の手順が必要です。

  1. 順序付けされた文字列データが保存されると、 FullVersion プロパティ値と SortId プロパティ値も保存されます。

  2. 順序指定された文字列データが取得されたら、コンストラクターを SortVersion 呼び出すことで、文字列の順序付けに使用されるオブジェクトを SortVersion 再作成できます。

  3. この新しくインスタンス化された SortVersion オブジェクトは、文字列データの SortVersion 順序付けに使用される規則を持つカルチャを反映するオブジェクトと比較されます。

  4. 2 つの SortVersion オブジェクトが等しくない場合は、文字列データを並べ替える必要があります。

具体的な例を次に示します。

コンストラクター

SortVersion(Int32, Guid)

SortVersion クラスの新しいインスタンスを作成します。

プロパティ

FullVersion

SortVersion オブジェクトの完全なバージョン番号を取得します。

SortId

この SortVersion オブジェクトの一意の識別子をグローバルに取得します。

メソッド

Equals(Object)

この SortVersion インスタンスが、指定したオブジェクトに等しいかどうかを示す値を返します。

Equals(SortVersion)

この SortVersion インスタンスが、指定した SortVersion オブジェクトに等しいかどうかを示す値を返します。

GetHashCode()

このインスタンスのハッシュ コードを返します。

GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)

演算子

Equality(SortVersion, SortVersion)

2 つの SortVersion インスタンスが等しいかどうかを示します。

Inequality(SortVersion, SortVersion)

SortVersion の 2 つのインスタンスが等しくないかどうかを示します。

適用対象

こちらもご覧ください