String.Compare(String, String, StringComparison)方法

本文介绍C#中使用String.Compare方法进行字符串比较的优势,包括选择是否忽略大小写及文化敏感性,解决不同文化背景下的特殊字符匹配问题。

这是C#中用来比较两个字符串的较好方法,原因如下:

1. 可以选择是否忽略单词大小写,相比于将单词全转换为大写(toUpperCase())或小写(toLowerCase())后再比较,String.Compare的效率更高。

2. 可以设置是否采用文化敏感(culture-sensitive)的排序规则,其中,(StringComparsion.)CurrentCulture和InvariantCulture是文化敏感的;Ordinal是非文化敏感的,该模式下会比较字符的原始字节码的值。为什么会有上述关于文化敏感的选择呢?微软的官方文档(https://msdn.microsoft.com/en-us/library/ms973919.aspx)里介绍了下述的“The Turkish-I”问题:

For nearly all Latin alphabets, including U.S. English, the character i (\u0069) is the lowercase version of the character I (\u0049). This casing rule quickly becomes the default for someone programming in such a culture. However, in Turkish ("tr-TR"), there exists a capital "i with a dot," character (\u0130), which is the capital version of i. Similarly, in Turkish, there is a lowercase "i without a dot," or  (\u0131), which capitalizes to I. This behavior occurs in the Azeri culture ("az") as well.

大意是,几乎所有的拉丁字母表,包括美国英语,字符i (\u0069) 是字符I (\u0049) 的小写版本,这个大小写规则也是身处这样的文化中的程序员采用的默认规则。但是,在土耳其语里("tr-TR"),存在大写的“有个点的i”,即  (\u0130),它是i的大写版本;类似,土耳其语里也存在小写的“没有点的i”,即 (\u0131),它大写就是I。这一现象在Azeri文化("az")中也存在。

另外也可以参考下面这个例子(http://stackoverflow.com/questions/492799/difference-between-invariantculture-and-ordinal-string-comparison):

        var s1 = "Strasse";
        var s2 = "Straße";

        s1.Equals(s2, StringComparison.Ordinal);           //false

        s1.Equals(s2, StringComparison.InvariantCulture);  //true
这个现象叫字符扩充(character expansion),在InvariantCulture模式下,ß会被扩充为ss。

所以呢,一般比较字符串似乎采用String.Compare(s1, s2, StringComparison.CurrentCulture),或再加上IgnoreCase。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值