Поделиться через


Сравнение строк без учета языка и региональных параметров

По умолчанию метод String.Compare выполняет сравнение с учетом языка и региона и регистра символов. Этот метод также содержит несколько перегрузок, которые предоставляют параметр culture, позволяющий задать используемый язык и региональные параметры, и параметр comparisonType, позволяющий указать используемые правила сравнения. При вызове этих методов вместо перегрузки по умолчанию удаляется любая неопределенность в отношении правил, используемых при вызове конкретного метода, и четко определяется, учитываются ли при конкретном сравнении язык и региональные параметры.

Примечание.

Обе перегрузки метода String.CompareTo выполняют сравнение с учетом языка и региональных параметров и с учетом регистра; для сравнения без учета языка и региональных параметров этот метод использовать нельзя. Для получения более понятного кода рекомендуется вместо этого метода использовать метод String.Compare.

Для операций с учетом языка и региональных параметров в качестве параметра StringComparison.CurrentCulture следует указать значение перечисления StringComparison.CurrentCultureIgnoreCase или comparisonType. Чтобы выполнить сравнение с учетом языка и региональных параметров, используя назначенный (отличный от текущего) язык и региональные параметры, в качестве параметра CultureInfo следует указать объект culture, представляющий этот язык и региональные параметры.

Поддерживаемые методом String.Compare операции сравнения строк без учета языка и региональных параметров могут быть лингвистическими (выполняемыми на основе правил сортировки инвариантного языка и региональных параметров) или нелингвистическими (выполняемыми на основе порядковых номерах символов в строке). Большинство операций сравнения строк без учета языка и региональных параметров являются нелингвистическими. Для таких операций сравнения в качестве параметра StringComparison.Ordinal следует указать значение перечисления StringComparison.OrdinalIgnoreCase или comparisonType. Например, если решение, влияющее на безопасность (к примеру, сравнение имени пользователя или пароля), принимается на основе результата сравнения строк, операция должна быть нелингвистической и выполняться без учета языка и региональных параметров, чтобы на результат не повлияли правила конкретного языка и региональных параметров.

Если требуется согласованная лингвистическая обработка соответствующих строк из нескольких языков и региональных параметров, следует использовать лингвистическое сравнение строк без учета языка и региональных параметров. Например, если приложение отображает в списке слова, в которых используется несколько кодировок, может потребоваться отображать слова в одном и том же порядке независимо от текущего языка и региональных параметров. Для операций лингвистического сравнения без учета языка и региональных параметров .NET определяет инвариантный язык и региональные параметры на основе операций лингвистического сравнения для английского языка. Для выполнения лингвистического сравнения без учета языка и региональных параметров в качестве параметра StringComparison.InvariantCulture следует указать StringComparison.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, а также таблицу параметров сортировки по умолчанию для элементов Юникод — таблицу весовых коэффициентов сортировки для Linux и macOS.

См. также