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

更新:2007 年 11 月

默认情况下,Compare 方法执行区分区域性和区分大小写的比较。但是,提供了 String.Compare 方法的重载,它允许您通过提供 culture 参数来指定要使用的区域性。应用程序代码应该清楚地说明字符串比较是区分区域性的,还是不区分区域性的。对于区分区域性的操作,请指定 CultureInfo.CurrentCulture 属性作为 culture 参数。对于不区分区域性的操作,请指定 CultureInfo.InvariantCulture 属性作为 culture 参数。

如果安全决策基于字符串比较的结果,则操作应该不区分区域性,以确保结果不会受 CultureInfo.CurrentCulture 值的影响。有关说明不区分区域性的字符串比较如何产生不一致结果的示例,请参见自定义大小写映射和排序规则

默认情况下,String.CompareTo 方法的重载执行区分区域性和区分大小写的比较。而且,这种方法的任何重载都不允许您指定不区分区域性的比较。为了使代码清楚,建议您使用 String.Compare 方法,为区分区域性的操作指定 CultureInfo.CurrentCulture 或为不区分区域性的操作指定 CultureInfo.InvariantCulture

使用 String.Compare 方法

以下代码行说明了如何使用 String.Compare 方法对 string1 和 string2 执行区分大小写的比较和区分区域性的比较。CultureInfo.CurrentCulture 作为 culture 参数传输,指出将要使用 CurrentCulture 的大小写映射和排序规则。

Dim compareResult As Integer = String.Compare(string1, string2, False, CultureInfo.CurrentCulture)
int compareResult = String.Compare(string1, string2, false, CultureInfo.CurrentCulture);

有关说明如何使用 String.Compare 方法执行区分区域性的比较的完整代码示例,请参见“针对特定区域性对数据进行比较和排序”。

要使此操作不区分区域性,您必须将 CultureInfo.InvariantCulture 指定为 culture 参数。下面的示例代码行中说明了这一点。

Dim compareResult As Integer = String.Compare(string1, string2, False, CultureInfo.InvariantCulture)
int compareResult = String.Compare(string1, string2, false, CultureInfo.InvariantCulture);

下面的代码示例说明了如何使用前面的代码行执行不区分区域性的字符串比较。

Imports System
Imports System.Globalization

Public Class CompareSample
    Public Shared Sub Main()
        Dim string1 As String = "file"
        Dim string2 As String = "FILE"
        
        Dim compareResult As Integer = String.Compare(string1, string2, _
            False, CultureInfo.InvariantCulture)   
        Console.WriteLine("A case-insensitive comparison of {0} and {1} is _
            {2}", string1, string2, compareResult)
    End Sub
End Class
using System;
using System.Globalization;

public class CompareSample
{
    public static void Main()
    {
        String string1 = "file";
        String string2 = "FILE";

        int compareResult = String.Compare(string1, string2, false, 
        CultureInfo.InvariantCulture);
        Console.WriteLine("A case-insensitive comparison of {0} and {1} is 
            {2}", string1, string2, compareResult);
    }
}

使用 String.CompareTo 方法

下面的示例使用 String.CompareTo 方法对 string1 与 string2 进行比较。默认情况下,比较是区分区域性和区分大小写的。

Dim compareResult As Integer = string1.CompareTo(string2)
int compareResult = string1.CompareTo(string2);

因为 culture 参数不是显式传递的,所以上面示例的意图不太明确。应用程序应使用 String.Compare 方法替换 String.CompareTo 方法,以便明确应用程序是否区分区域性。如果要对 string1 和 string2 执行区分大小写和区分区域性的比较,应用程序应将 CultureInfo.CurrentCulture 作为 culture 参数传递。这样,就会使用 CurrentCulture 的大小写映射和排序规则,如下例所示。

Dim compareResult As Integer = String.Compare(string1, string2, False, CultureInfo.CurrentCulture)
int compareResult = String.Compare(string1, string2, false, CultureInfo.CurrentCulture);

如果要对 string1 和 string2 执行区分大小写和不区分区域性的比较,应用程序应将 CultureInfo.InvariantCulture 作为 culture 参数传递。这样,就会使用 InvariantCulture 的大小写映射和排序规则,如下例所示。

Dim compareResult As Integer = String.Compare(string1, string2, False, CultureInfo.InvariantCulture)
int compareResult = String.Compare(string1, string2, false, CultureInfo.InvariantCulture);

有关说明如何使用 String.Compare 方法获取不区分区域性结果的完整代码示例,请参见“使用 String.Compare 方法”。

请参见

概念

针对特定区域性对数据进行比较和排序

参考

String.Compare

String.CompareTo

其他资源

执行不区分区域性的字符串操作