SortVersion Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет сведения о версии Юникода, используемой для сравнения и сортировки строк.
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 языка и региональных параметров. Он использует BinaryReader объекты и BinaryWriter для хранения и извлечения упорядоченных данных из файла данных с именем 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 с пакетом обновления 1 (SP1) до платформа .NET Framework 4 каждая версия the.NET Framework включала таблицы, содержащие весовые коэффициенты сортировки и данные по нормализации строк и основанные на определенной версии Юникода. В платформа .NET Framework 4.5 наличие этих таблиц зависит от операционной системы:
В Windows 7 и предыдущих версиях операционной системы Windows таблицы по-прежнему используются для сравнения и упорядочения строк.
На Windows 8 платформа .NET Framework делегирует операции сравнения строк и упорядочивания операционной системе.
Следовательно, результат сравнения строк может зависеть не только от версии платформа .NET Framework, но и от версии операционной системы, как показано в следующей таблице. Обратите внимание, что этот список поддерживаемых версий Юникода применяется только к сравнению и сортировке символов. Он не применяется для классификации символов Юникода по категориям.
Версия платформы .NET Framework | Операционная система | Версия Юникода |
---|---|---|
.NET Framework 4 | Все операционные системы | Юникод 5.0 |
платформа .NET Framework 4.5 и более поздних версий платформа .NET Framework | Windows 7 | Юникод 5.0 |
платформа .NET Framework 4.5 и более поздних версий платформа .NET Framework | Windows 8 и более поздних версий операционной системы Windows | Юникод 6.0 |
На Windows 8, так как версия Юникода, используемая для сравнения и упорядочения строк, зависит от версии операционной системы, результаты сравнения строк могут отличаться даже для приложений, работающих в определенной версии платформа .NET Framework.
Сортировка и сравнение строк в .NET Core
Все версии .NET Core используют базовую операционную систему при сравнении строк. Таким образом, результаты сравнения строк или порядок сортировки строк зависят от версии Юникода, используемой операционной системой при сравнении. В Linux и macOS международные компоненты для библиотек Юникода предоставляют реализацию API для сравнения и сортировки.
Использование класса SortVersion
Класс SortVersion предоставляет сведения о версии Юникода, используемой .NET для сравнения и упорядочения строк. Она позволяет разработчикам создавать приложения, которые могут обнаруживать и успешно обрабатывать изменения в версии Юникода, используемой для сравнения и сортировки строк приложения.
Создать экземпляр SortVersion объекта можно двумя способами:
Путем вызова конструктора SortVersion , который создает экземпляр нового SortVersion объекта на основе номера версии и идентификатора сортировки. Этот конструктор наиболее полезен при повторном создании объекта из SortVersion сохраненных данных.
Путем получения значения CompareInfo.Version свойства . Это свойство предоставляет сведения о версии Юникода, используемой реализацией .NET, в которой выполняется приложение.
Класс SortVersion имеет два свойства, и SortId, которые указывают версию Юникода и конкретный язык и региональные параметры, FullVersion используемые для сравнения строк. Свойство FullVersion является произвольным числовым значением, которое отражает версию Юникода, используемую для сравнения строк, а свойство является произвольнымGuid, отражающим язык и SortId региональные параметры, соглашения которых используются для сравнения строк. Значения этих двух свойств важны только при сравнении двух SortVersion объектов с помощью Equals метода , Equality оператора или Inequality оператора .
Обычно объект используется SortVersion при сохранении или извлечении определенной формы упорядоченных строковых данных с учетом языка и региональных параметров, таких как индексы или сами литеральные строки. Для этого необходимо выполнить следующие действия:
При сохранении FullVersion упорядоченных строковых данных также сохраняются значения свойств и SortId .
При извлечении упорядоченных строковых данных можно повторно создать объект, используемый SortVersion для упорядочения строк, вызвав SortVersion конструктор .
Этот новый экземпляр SortVersion объекта сравнивается с SortVersion объектом, который отражает язык и региональные параметры, соглашения которых используются для упорядочивания строковых данных.
Если два 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) |
Указывает, равны ли два экземпляра SortVersion. |
Inequality(SortVersion, SortVersion) |
Показывает, являются ли два экземпляра SortVersion неравными. |