SortKey 类

表示将字符串映射到其排序关键字的映射结果。

**命名空间:**System.Globalization
**程序集:**mscorlib(在 mscorlib.dll 中)

语法

声明
<SerializableAttribute> _
<ComVisibleAttribute(True)> _
Public Class SortKey
用法
Dim instance As SortKey
[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public class SortKey
[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public ref class SortKey
/** @attribute SerializableAttribute() */ 
/** @attribute ComVisibleAttribute(true) */ 
public class SortKey
SerializableAttribute 
ComVisibleAttribute(true) 
public class SortKey

备注

两个字符串的区域敏感比较依赖于字符串中的每一个字符,有几个排序权重类别,包括语言、字母、大小写和音调符号权重。排序关键字充当特定字符串的这些权重的储存库。具体说来,SortKey 对象的值是其关键字数据,这是一个字节序列,该序列是字符串本身、特定于区域性的排序规则和用户指定的比较选项的编码。使用排序关键字的比较由每个排序关键字中相应关键字数据的一个按位比较组成。

性能注意事项

执行字符串比较时,Compare 方法和 System.Globalization.CompareInfo.Compare 方法生成的结果是一样的。

实际上,System.Globalization.CompareInfo.Compare 方法为每个字符串生成排序关键字,执行比较,然后丢弃排序关键字并返回比较结果。而事实上,System.Globalization.CompareInfo.Compare 方法并不生成完整的排序关键字然后执行比较。相反,此方法为每个字符串中的每个文本元素(即基字符、代理项对或组合字符序列)生成关键字数据,然后比较相应文本元素的关键字数据。一旦确定了比较的最终结果,操作立即终止。计算出排序关键字信息,但不创建 SortKey 对象。如果每个字符串比较一次,该策略在性能方面很实用;但如果同样的字符串比较很多次,开销就会很高。

Compare 方法需要在执行比较前为每个字符串生成一个 SortKey 对象。第一次比较时,由于在生成 SortKey 对象上所花的时间和内存,该策略在性能方面开销较大,但如果相同的排序关键字被比较多次,它就变得很实用。

例如,假设用户编写了一个应用程序,用于在数据库表中搜索那些基于字符串的索引列与指定的搜索字符串相匹配的行。该表包含成百上千行,而将搜索字符串与每行的索引进行比较将花费很长时间。相反,当存储行及其索引列时,也在某个列中生成并存储用于提高搜索性能的索引排序关键字。每当搜索目标行时,应用程序并不比较搜索字符串和索引字符串,而是比较搜索字符串的排序关键字和索引字符串的排序关键字。

安全注意事项

CompareInfo.GetSortKey(String,CompareOptions) 方法返回一个 SortKey 对象,其值基于一个指定字符串和 CompareOptions 值,以及与基础 CompareInfo 对象关联的区域性。如果安全决策依赖于字符串比较或大小写更改操作,则使用固定区域性的 CompareInfo.GetSortKey(String,CompareOptions) 方法以确保操作行为的一致性(不论系统的区域性设置如何)。

通过下列步骤可获取 GetSortKey 方法:

  1. 使用 CultureInfo.InvariantCulture 属性获取固定区域性。

  2. 使用固定区域性的 CompareInfo 属性获取 CompareInfo 对象。

  3. 使用 CompareInfo 对象的 GetSortKey 方法。

SortKey 对象的值等效于调用带有 LCMAP_SORTKEY 标志的 Windows API LCMapString 方法。然而,与 LCMapString 不同,英语字符的排序关键字位于朝鲜语字符的排序关键字之前。

有关排序关键字的更多信息,请参见 Unicode 主页 上的 Unicode Technical Standard #10,"Unicode Collation Algorithm"(Unicode 技术标准 #10“Unicode 排序算法”)。

示例

下面的代码示例使用 en-US 和 es-ES 区域性以及 en-US 和 es-ES 传统区域性来比较字符串“llama”。

Imports System
Imports System.Globalization

Public Class SamplesSortKey

   Public Shared Sub Main()

      ' Creates a SortKey using the en-US culture.
      Dim myComp_enUS As CompareInfo = New CultureInfo("en-US", False).CompareInfo
      Dim mySK1 As SortKey = myComp_enUS.GetSortKey("llama")

      ' Creates a SortKey using the es-ES culture with international sort.
      Dim myComp_esES As CompareInfo = New CultureInfo("es-ES", False).CompareInfo
      Dim mySK2 As SortKey = myComp_esES.GetSortKey("llama")

      ' Creates a SortKey using the es-ES culture with traditional sort.
      Dim myComp_es As CompareInfo = New CultureInfo(&H40A, False).CompareInfo
      Dim mySK3 As SortKey = myComp_es.GetSortKey("llama")

      ' Compares the en-US SortKey with each of the es-ES SortKey objects.
      Console.WriteLine("Comparing ""llama"" in en-US and in es-ES with international sort : {0}", SortKey.Compare(mySK1, mySK2))
      Console.WriteLine("Comparing ""llama"" in en-US and in es-ES with traditional sort   : {0}", SortKey.Compare(mySK1, mySK3))

   End Sub 'Main 

End Class 'SamplesSortKey


'This code produces the following output.
'
'Comparing "llama" in en-US and in es-ES with international sort : 0
'Comparing "llama" in en-US and in es-ES with traditional sort   : -1
using System;
using System.Globalization;

public class SamplesSortKey  {

   public static void Main()  {

      // Creates a SortKey using the en-US culture.
      CompareInfo myComp_enUS = new CultureInfo("en-US",false).CompareInfo;
      SortKey mySK1 = myComp_enUS.GetSortKey( "llama" );

      // Creates a SortKey using the es-ES culture with international sort.
      CompareInfo myComp_esES = new CultureInfo("es-ES",false).CompareInfo;
      SortKey mySK2 = myComp_esES.GetSortKey( "llama" );

      // Creates a SortKey using the es-ES culture with traditional sort.
      CompareInfo myComp_es   = new CultureInfo(0x040A,false).CompareInfo;
      SortKey mySK3 = myComp_es.GetSortKey( "llama" );

      // Compares the en-US SortKey with each of the es-ES SortKey objects.
      Console.WriteLine( "Comparing \"llama\" in en-US and in es-ES with international sort : {0}", SortKey.Compare( mySK1, mySK2 ) );
      Console.WriteLine( "Comparing \"llama\" in en-US and in es-ES with traditional sort   : {0}", SortKey.Compare( mySK1, mySK3 ) );

   }

}

/*
This code produces the following output.

Comparing "llama" in en-US and in es-ES with international sort : 0
Comparing "llama" in en-US and in es-ES with traditional sort   : -1
*/
using namespace System;
using namespace System::Globalization;
int main()
{
   
   // Creates a SortKey using the en-US culture.
   CultureInfo^ MyCI = gcnew CultureInfo( "en-US",false );
   CompareInfo^ myComp_enUS = MyCI->CompareInfo;
   SortKey^ mySK1 = myComp_enUS->GetSortKey( "llama" );
   
   // Creates a SortKey using the es-ES culture with international sort.
   MyCI = gcnew CultureInfo( "es-ES",false );
   CompareInfo^ myComp_esES = MyCI->CompareInfo;
   SortKey^ mySK2 = myComp_esES->GetSortKey( "llama" );
   
   // Creates a SortKey using the es-ES culture with traditional sort.
   MyCI = gcnew CultureInfo( 0x040A,false );
   CompareInfo^ myComp_es = MyCI->CompareInfo;
   SortKey^ mySK3 = myComp_es->GetSortKey( "llama" );
   
   // Compares the en-US SortKey with each of the es-ES SortKey objects.
   Console::WriteLine( "Comparing \"llama\" in en-US and in es-ES with international sort : {0}", SortKey::Compare( mySK1, mySK2 ) );
   Console::WriteLine( "Comparing \"llama\" in en-US and in es-ES with traditional sort   : {0}", SortKey::Compare( mySK1, mySK3 ) );
}

/*
This code produces the following output.

Comparing S"llama" in en-US and in es-ES with international sort : 0
Comparing S"llama" in en-US and in es-ES with traditional sort   : -1
*/
import System.*;
import System.Globalization.*;

public class SamplesSortKey
{   
    public static void main(String[] args)
    {
        // Creates a SortKey using the en-US culture.
        CompareInfo myComp_enUS = 
            (new CultureInfo("en-US", false)).get_CompareInfo();
        SortKey mySK1 = myComp_enUS.GetSortKey("llama");

        // Creates a SortKey using the es-ES culture with international sort.
        CompareInfo myComp_esES = 
            (new CultureInfo("es-ES", false)).get_CompareInfo();
        SortKey mySK2 = myComp_esES.GetSortKey("llama");

        // Creates a SortKey using the es-ES culture with traditional sort.
        CompareInfo myComp_es = 
            (new CultureInfo(0x40A, false)).get_CompareInfo();
        SortKey mySK3 = myComp_es.GetSortKey("llama");

        // Compares the en-US SortKey with each of the es-ES SortKey objects.
        Console.WriteLine("Comparing \"llama\" in en-US and in es-ES with"
            + " international sort : {0}",
            System.Convert.ToString( SortKey.Compare(mySK1, mySK2)));
        Console.WriteLine("Comparing \"llama\" in en-US and in es-ES with"
            + " traditional sort   : {0}",
            System.Convert.ToString( SortKey.Compare(mySK1, mySK3)));
    } //main
} //SamplesSortKey

/*
This code produces the following output.

Comparing "llama" in en-US and in es-ES with international sort : 0
Comparing "llama" in en-US and in es-ES with traditional sort   : -1
*/

继承层次结构

System.Object
  System.Globalization.SortKey

线程安全

此类型的任何公共静态(Visual Basic 中的 Shared)成员都是线程安全的,但不保证所有实例成员都是线程安全的。

平台

Windows 98、Windows 2000 SP4、Windows Millennium Edition、Windows Server 2003、Windows XP Media Center Edition、Windows XP Professional x64 Edition、Windows XP SP2、Windows XP Starter Edition

.NET Framework 并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求

版本信息

.NET Framework

受以下版本支持:2.0、1.1、1.0

请参见

参考

SortKey 成员
System.Globalization 命名空间
CompareInfo.GetSortKey
KeyData