我有一些这样的代码:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
我不在乎这个案子。我应该使用OrdinalIgnoreCase
,InvariantCultureIgnoreCase
或CurrentCultureIgnoreCase
?
我有一些这样的代码:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
我不在乎这个案子。我应该使用OrdinalIgnoreCase
,InvariantCultureIgnoreCase
或CurrentCultureIgnoreCase
?
Answers:
较新的.Net Docs现在具有一个表格,可帮助您决定哪种方式最适合您的情况。
摘自MSDN的“ 在Microsoft .NET 2.0中使用字符串的新建议 ”
摘要:以前
InvariantCulture
用于字符串比较,大小写和排序的代码所有者应强烈考虑String
在Microsoft .NET 2.0中使用一组新的重载。具体来说,被设计为与文化无关且在语言上不相关的数据应开始使用新枚举的StringComparison.Ordinal
或StringComparison.OrdinalIgnoreCase
成员指定重载StringComparison
。它们强制进行逐字节比较,strcmp
这不仅避免了实质上是符号字符串的语言解释带来的错误,而且还提供了更好的性能。
"Straße"
和"STRASSE"
。当使用OrdinalIgnoreCase
的Equals
收益false
,而InvariantCultureIgnoreCase
说他们是平等的。
比较unicode字符串很难:
文本处理软件中Unicode字符串搜索和比较的实现必须考虑到等效代码点的存在。在没有此功能的情况下,搜索特定代码点序列的用户将无法找到具有不同但规范上等效的代码点表示形式的其他视觉上无法区分的字形。
请参阅:http : //en.wikipedia.org/wiki/Unicode_equivalence
如果你想在不区分大小写的方式来比较2个unicode字符串,并希望它的工作无处不在,你有一个不可能的问题。
典型的例子是土耳其语i,当大写时变成İ(注意点)
默认情况下,.Net框架通常将CurrentCulture用于与字符串相关的功能,但非常重要的例外.Equals
是使用序数比较(逐字节比较)。
根据设计,这会导致各种字符串函数的行为根据计算机的文化而有所不同。
尽管如此,有时我们还是想要一个“通用”,不区分大小写。
例如,无论您的应用程序安装在哪台计算机上,您都可能希望字符串比较的行为相同。
为此,我们有3种选择:
Unicode等价规则很复杂,这意味着使用方法1)或2)比昂贵OrdinalIgnoreCase
。OrdinalIgnoreCase
不执行任何特殊的unicode规范化的事实意味着某些在计算机屏幕上以相同方式呈现的字符串将不被视为相同。例如:"\u0061\u030a"
和"\u00e5"
都渲染å。但是,在序数比较中将认为是不同的。
选择哪种取决于您正在构建的应用程序。
Microsoft有其明确建议的一组建议。但是,在解决这些问题之前理解unicode等效的概念确实很重要。
另外,请记住,OrdinalIgnoreCase是一种非常特殊的野兽,即与字典混合中的某些杂项相比,可以选择并选择一些序数。这可能会造成混淆。
这取决于您想要什么,尽管我会回避不变文化,除非您非常确定您永远不会希望将其他语言的代码本地化。请改用CurrentCulture。
另外,OrdinalIgnoreCase应该尊重数字,这可能是您想要的,也可能不是。