Разница между String.Compare и CultureInfo в CompareInfo - PullRequest
1 голос
/ 05 ноября 2011

Я пробовал свои силы над System.Gloablization в небольшом настольном приложении. Я немного озадачен дополнительным контролем, который CultureInfo.Compare() может предложить, чем использование метода String.Compare() и его перегрузок.

Допустим, у меня есть две строки

String s1 = "\u3057\u3093\u304B\u3093\u305b\u3093"; //some Japanese text in Unicode
String s2 = "\u30b7\u3043\u30ab\u30f3\u30bb\u30f3"; //Some Japanese text in Unicode
CultureInfo ci = new CultureInfo("ja-JP");

String.Compare имеет несколько перегрузок, из которых в настоящее время я бы использовал

String.Compare(String strA, String strB, CultureInfo culture, CompareOptions options)

(где CompareOptions - это перечислимый тип)

Однако я мог бы также использовать:

CompareInfo compareInfo = CompareInfo.GetCompareInfo("ja-JP");
compareInfo.Compare(String strA, String strB, CompareOptions options);

для той же цели.

Как объект CompareInfo в CultureInfo обеспечивает больший контроль при обработке такой ситуации в глобализации, как текст на японском языке, например, для: CompareOptions.IgnoreKanaType (где Kana - это вторая форма японского языка, которую можно игнорировать в строке, используя перечисляемый тип CompareOptions).

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

Полагаю, String.Compare просто делегирует предоставленный CompareInfo - просто удобнее не хвататься за CompareInfo самостоятельно.

Учитывая, что они делают то же самое, я не уверен, что на самом деле означает ваш последний вопрос.

0 голосов
/ 05 ноября 2011

Да, Jon Skeet прав, внутренний String.Compare вызывает метод CultureInfo.Compare, вот фактический код из IL:

    public static int Compare(string strA, string strB, CultureInfo culture, CompareOptions options)
{
    if (culture == null)
    {
        throw new ArgumentNullException("culture");
    }
    return culture.CompareInfo.Compare(strA, strB, options);
}

Еще одна вещь, которую следует отметить, - это метод CultureInfo.Compareвнутренне не проверяет (сначала), что вход (культура) равен нулю или нет.Он просто напрямую выполняет другую операцию.Также он снова вызывает API-интерфейс string.Compare (string, string, StringOptions), если используется OrdinalIgnoreCase.Поэтому лучше всего использовать String.Compare, поскольку перед выполнением какой-либо операции выполняется нулевая проверка.

...