执行不区分区域性的字符串比较

默认情况下,String.Compare 方法执行区分区域性和区分大小写的比较。 此方法还包括多个重载,这些重载提供了一个 culture 参数和一个 comparisonType 参数,前者允许你指定要使用的区域性,后者允许你指定要使用的比较规则。 调用这些方法(而非调用默认重载)将消除与特定方法调用中使用的规则相关的任何歧义,并阐明某个特定比较是区分区域性的还是不区分区域性的。

注意

String.CompareTo 方法的两种重载都执行区分区域性且区分大小写的比较;你不能使用此方法来执行不区分区域性的比较。 为了使代码简单明了,建议你改用 String.Compare 方法。

对于区分区域性的操作,请将 StringComparison.CurrentCultureStringComparison.CurrentCultureIgnoreCase 枚举值指定为 comparisonType 参数。 若要使用除当前区域性之外的指定区域性来执行区域性敏感型比较,请将表示相应区域性的 CultureInfo 对象指定为 culture 参数。

String.Compare 方法所支持的不区分区域性的字符串比较可以是语义的(基于固定区域性的排序约定)或非语义的(基于字符串中字符的序号值)。 大多数不区分区域性的字符串比较是非语义的。 对于这些比较,请将 StringComparison.OrdinalStringComparison.OrdinalIgnoreCase 枚举值指定为 comparisonType 参数。 例如,如果安全决策(例如,用户名或密码比较)基于字符串比较的结果,则操作应不区分区域性且是非语义的,以确保结果不受特定区域性或语言的约定的影响。

如果你希望以一致方式处理来自多个区域性的语义相关字符串,请使用不区分区域性的语义字符串比较。 例如,如果你的应用程序在列表框中显示使用多个字符集的字词,则不管当前区域性如何,你可能都需要按相同的顺序来显示这些字词。 对于不区分区域性的语义比较,.NET 将定义一个基于英语的语义约定的固定区域性。 若要执行不区分区域性的语义比较,请将 StringComparison.InvariantCultureStringComparison.InvariantCultureIgnoreCase 指定为 comparisonType 参数。

下面的示例将执行两个不区分区域性的非语义字符串比较。 第一个比较区分大小写,而第二个比较不区分大小写。

using System;

public class CompareSample
{
    public static void Main()
    {
        string string1 = "file";
        string string2 = "FILE";
        int compareResult = 0;

        compareResult = String.Compare(string1, string2,
                                       StringComparison.Ordinal);
        Console.WriteLine("{0} comparison of '{1}' and '{2}': {3}",
                          StringComparison.Ordinal, string1, string2,
                          compareResult);

        compareResult = String.Compare(string1, string2,
                                       StringComparison.OrdinalIgnoreCase);
        Console.WriteLine("{0} comparison of '{1}' and '{2}': {3}",
                          StringComparison.OrdinalIgnoreCase, string1, string2,
                          compareResult);
    }
}
// The example displays the following output:
//    Ordinal comparison of 'file' and 'FILE': 32
//    OrdinalIgnoreCase comparison of 'file' and 'FILE': 0
Public Class CompareSample
    Public Shared Sub Main()
        Dim string1 As String = "file"
        Dim string2 As String = "FILE"
        Dim compareResult As Integer

        compareResult = String.Compare(string1, string2, _
                                       StringComparison.Ordinal)
        Console.WriteLine("{0} comparison of '{1}' and '{2}': {3}",
                          StringComparison.Ordinal, string1, string2,
                          compareResult)

        compareResult = String.Compare(string1, string2,
                                       StringComparison.OrdinalIgnoreCase)
        Console.WriteLine("{0} comparison of '{1}' and '{2}': {3}",
                          StringComparison.OrdinalIgnoreCase, string1, string2,
                          compareResult)
    End Sub
End Class
' The example displays the following output:
'    Ordinal comparison of 'file' and 'FILE': 32
'    OrdinalIgnoreCase comparison of 'file' and 'FILE': 0

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

另请参阅