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

更新:2010 年 5 月

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

注意注意

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

对于区分区域性的操作,请将 StringComparison.CurrentCultureStringComparison.CurrentCultureIgnoreCase 枚举值指定为 comparisonType 参数。 如果您希望使用当前区域性之外的某个指定区域性来执行区分区域性的比较时,请将表示该区域性的 CultureInfo 对象指定为 culture 参数。

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

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

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

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
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

请参见

参考

String.Compare

String.CompareTo

概念

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

在 .NET Framework 中使用字符串的最佳做法

其他资源

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

修订记录

日期

修订记录

原因

2010 年 5 月

已进行修订以反映处理字符串的最佳做法。

内容 Bug 修复