SortKey

本文提供了此 API 参考文档的补充说明。

区分区域性的两个字符串比较取决于字符串中的每个字符,这些字符具有多个类别的排序权重,包括脚本、字母、大小写和变音符号权重。 排序关键字用作为特定字符串提供的这些权重的存储库。

CompareInfo.GetSortKey 方法返回 SortKey 类的实例,它反映指定字符串中字符的区分区域性的映射。 SortKey 对象的值是其关键数据,由 KeyData 属性返回。 此关键数据包含对字符串、区域性特定的排序规则和用户指定的比较选项进行编码的一系列字节。 使用排序关键字的比较包括每个排序关键字中相应关键数据的按位比较。 例如,如果您通过调用带 GetSortKey(String, CompareOptions) 的值的 CompareOptions.IgnoreCase 方法来创建一个排序键,则使用该排序键的字符串比较运算不区分大小写。

在创建字符串的排序键之后,可通过调用静态 SortKey.Compare 方法比较排序键。 此方法执行简单的逐字节比较,因此它比 String.CompareCompareInfo.Compare 方法的速度快得多。

注意

可以下载排序权重表,这是一组文本文件,其中包含有关 Windows 操作系统排序和比较操作中所使用的字符权重的信息,也可以下载默认 Unicode 排序元素表,这是适用于 Linux 和 macOS 的排序权重表。

性能注意事项

执行字符串比较时,CompareCompareInfo.Compare 方法生成相同的结果,但它们面向不同的方案。

在较高层次,CompareInfo.Compare 方法为每个字符串生成排序关键字,执行比较,然后丢弃排序关键字并返回比较结果。 但是,CompareInfo.Compare 方法实际上不生成整个排序关键字来执行此比较。 相反,此方法将为每个字符串中的每个文本元素(即,基字符、代理项对或组合字符序列)生成关键数据。 然后,该方法会比较相应文本元素的关键字数据。 确定比较的最终结果后,该操作将立即终止。 将计算排序关键字信息,但不会创建 SortKey 对象。 如果两个字符串都比较一次,则此策略在性能方面是经济的,但如果多次比较相同的字符串,则会变得昂贵。

在执行比较之前,Compare 方法需要为每个字符串生成 SortKey 对象。 由于为生成 SortKey 对象而投入的时间和内存,因此第一次比较时,此策略的性能非常昂贵。 但是,如果多次比较相同的排序关键字,它将变得很经济。

例如,假设你编写一个应用程序,该应用程序在数据库表中搜索基于字符串的索引列与指定的搜索字符串匹配的行。 该表包含数千行,将搜索字符串与每行中的索引进行比较需要很长时间。 因此,当应用程序存储行及其索引列时,它还会在专用于提高搜索性能的列中生成和存储索引的排序关键字。 当应用程序搜索目标行时,它将搜索字符串的排序关键字与索引字符串的排序关键字进行比较,而不是将搜索字符串与索引字符串进行比较。

安全注意事项

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

使用以下步骤获取排序键:

  1. CultureInfo.InvariantCulture 属性中检索固定区域性。

  2. CompareInfo 属性中检索固定区域性的 CultureInfo.CompareInfo 对象。

  3. 调用 CompareInfo.GetSortKey(String, CompareOptions) 方法。

使用 SortKey 对象的值等效于调用带指定的 LCMAP_SORTKEY 值的 Windows LCMapString 方法。 但是,对于 SortKey 对象,英语字符的排序关键字位于朝鲜字符的排序关键字之前。

可以序列化 SortKey 对象,但只能使其跨 AppDomain 对象。 如果应用程序序列化对象 SortKey ,则当有新版本的 .NET 时,应用程序必须重新生成所有排序键。

有关排序关键字的详细信息,请参见 Unicode 联合会网站上的 Unicode 技术标准 #10“Unicode 排序算法”。