String.Compare和CultureInfo的CompareInfo之间的区别

时间:2011-11-05 12:17:40

标签: c# string globalization cultureinfo

我正在尝试在一个小型桌面应用程序中交出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);

出于同样的目的。

CultureInfo的CompareInfo对象如何在全球化处理这种情况时提供更多控制,例如日语文本,例如:CompareOptions.IgnoreKanaType(其中Kana是日语的第二种形式,可以使用CompareOptions枚举类型从字符串中忽略)。

2 个答案:

答案 0 :(得分:1)

我相信String.Compare只会委托给它提供的CompareInfo - 不必自己掌握CompareInfo就更方便了。

鉴于他们做同样的事情,我不确定你的最终问题究竟意味着什么。

答案 1 :(得分:0)

是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方法在内部不检查(首先)输入(culture)是否为null。它只是直接做其他操作。如果使用OrdinalIgnoreCase,它还会再次调用string.Compare(string,string,StringOptions)API。 所以最好使用String.Compare,因为在完成任何操作之前都会进行空检查。