本文提供了此 API 参考文档的补充说明。
区分区域性的两个字符串比较取决于字符串中的每个字符,这些字符具有多个类别的排序权重,包括脚本、字母、大小写和变音符号权重。 排序键用作特定字符串的这些权重的存储库。
CompareInfo.GetSortKey 方法返回 SortKey 类的一个实例,该实例反映指定字符串中字符的文化敏感映射。 SortKey 对象的值是其键数据,这是由 KeyData 属性返回的。 此键数据由一系列字节组成,这些字节对字符串、区域性特定的排序规则和用户指定的比较选项进行编码。 使用排序键的比较包括每个排序键中相应键数据的按位比较。 例如,如果通过调用GetSortKey(String, CompareOptions)方法并传入CompareOptions.IgnoreCase值来创建排序键,则使用该排序键的字符串比较将不区分大小写。
为字符串创建排序键后,可以通过调用静态 SortKey.Compare 方法比较排序键。 此方法执行逐字节比较,因此比 String.Compare 或 CompareInfo.Compare 方法快得多。
注释
可以下载 排序权重表,它是一组文本文件,其中包含 Windows 操作系统的排序和比较操作中使用的字符权重信息、默认 Unicode 排序规则元素表 和 Linux 与 macOS 的排序权重表。
性能注意事项
执行字符串比较时, Compare 和 CompareInfo.Compare 方法产生相同的结果,但它们面向不同的方案。
在高级别上,该方法 CompareInfo.Compare 为每个字符串生成排序键,执行比较,然后放弃排序键并返回比较结果。 但是,该方法 CompareInfo.Compare 实际上不会生成执行比较的整个排序键。 相反,该方法为每个文本元素(即基字符、代理项对或组合字符序列)在每个字符串中生成键数据。 然后,该方法比较相应文本元素的键数据。 确定比较的最终结果后,该操作将立即终止。 将计算排序关键字信息,但不会创建 SortKey 对象。 如果两个字符串都比较一次,则此策略在性能方面是经济的,但如果多次比较相同的字符串,则成本会变得昂贵。
在执行比较之前,该方法 Compare 需要为每个字符串生成一个 SortKey 对象。 由于需要花费时间和内存来生成 SortKey 对象,因此第一次比较时,此策略的性能非常昂贵。 但是,如果多次比较相同的排序键,它将变得更加划算。
例如,假设你编写一个应用程序,该应用程序在数据库表中搜索基于字符串的索引列与指定的搜索字符串匹配的行。 该表包含数千行,并将搜索字符串与每行中的索引进行比较需要很长时间。 因此,当应用程序存储行及其索引列时,它还会在专用于提高搜索性能的列中生成和存储索引的排序键。 当应用程序搜索目标行时,它将搜索字符串的排序键与索引字符串的排序键进行比较,而不是将搜索字符串与索引字符串进行比较。
安全注意事项
CompareInfo.GetSortKey(String, CompareOptions) 方法会返回一个 SortKey 对象,该对象基于指定的字符串和 CompareOptions 值以及与基础 CompareInfo 对象关联的区域性生成。 如果安全决策取决于字符串比较或大小写更改,则您应使用固定区域性的 CompareInfo.GetSortKey(String, CompareOptions) 方法来确保操作行为的一致性,无论操作系统的区域性设置如何。
使用以下步骤获取排序键:
从 CultureInfo.InvariantCulture 属性中检索不变的文化信息。
从 CompareInfo 属性中检索固定区域性的 CultureInfo.CompareInfo 对象。
使用 SortKey 对象的值等效于调用带指定的 LCMAP_SORTKEY 值的 Windows LCMapString
方法。 但是,对于 SortKey 对象,英语字符的排序键位于朝鲜字符的排序键前面。
SortKey 对象可以序列化,但这是为了能够跨越 AppDomain 对象。 如果应用程序序列化对象 SortKey ,则当有新版本的 .NET 时,应用程序必须重新生成所有排序键。
有关排序键的详细信息,请参阅 Unicode 联盟网站上的 Unicode 技术标准 #10、“Unicode 排序规则算法”。