通常最好使用 – StringComparison.OrdinalIgnoreCase或StringComparison.InvariantCultureIgnoreCase?
我有这样的代码:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then DoSomething() End If
我不在乎这个情况。 我应该使用OrdinalIgnoreCase
, InvariantCultureIgnoreCase
或CurrentCultureIgnoreCase
?
从MSDN的“ 在Microsoft .NET 2.0中使用string的新build议 ”
简介:以前使用InvariantCulture进行string比较,套pipe和sorting的代码所有者应该强烈考虑在Microsoft .NET 2.0中使用一组新的String重载。 具体来说,devise为文化不可知和语言不相关的数据应该使用新的StringComparison枚举的StringComparison.Ordinal或StringComparison.OrdinalIgnoreCase成员开始指定重载。 这些强制执行类似于strcmp的逐字节比较,不仅避免了本质上符号string的语言解释中的错误,而且提供了更好的性能。 (15页印刷)
这一切都取决于
比较unicodestring是困难的:
Unicode文本处理软件中Unicodestringsearch和比较的实现必须考虑到等效代码点的存在。 在没有这个特征的情况下,search特定代码点序列的用户将无法find具有不同但典型地等同的代码点表示的其他视觉上不可区分的字形。
请参阅: http : //en.wikipedia.org/wiki/Unicode_equivalence
如果您试图以不区分大小写的方式比较2个unicodestring,并希望它能够在任何地方工作,那么您就有一个不可能的问题。
典型的例子是土耳其我 ,当大写成为İ(注意点)
默认情况下,.Net框架通常使用CurrentCulture作为string相关的函数,而使用序数(逐字节)比较的.Equals
非常重要的例外。
这通过devise导致各种string函数的行为因计算机文化而异。
但是,有时我们需要一个“通用”,不区分大小写的比较。
例如,您可能希望string比较的行为方式相同,无论您的应用程序安装在哪台计算机上。
为了达到这个目标,我们有3个select
- 显式设置文化并使用unicode等价规则执行不区分大小写的比较。
- 将文化设置为不变文化,并使用unicode等价规则执行不区分大小写的比较。
- 使用OrdinalIgnoreCase将使用InvariantCulture大写string,然后执行逐字节比较。
Unicode等价规则是复杂的,这意味着使用方法1)或2)比OrdinalIgnoreCase
更昂贵。 OrdinalIgnoreCase
不执行任何特殊的Unicode规范化的事实意味着某些在计算机屏幕上以相同方式呈现的string将不会被视为相同。 例如: "\u0061\u030a"
和"\u00e5"
都渲染å。 然而,在一个序数比较将被认为是不同的。
你select哪个很重要取决于你正在构build的应用程序。
- 如果我正在编写一个只由土耳其用户使用的业务线应用程序,我肯定会使用方法1。
- 如果我只是需要一个简单的“假”不区分大小写的比较,比如说db中的列名(通常是英文),我可能会使用方法3。
微软提供了一套明确的指导方针。 然而,在解决这些问题之前理解unicode等价的概念是非常重要的。
另外,请记住,OrdinalIgnoreCase是一种非常特殊的野兽,就是挑选一些序数比较混杂的词典。 这可能会令人困惑。
MSDN对此有一些非常明确的build议: http : //msdn.microsoft.com/en-us/library/ms973919.aspx
我想这取决于你的情况。 由于序数比较实际上是在查看字符的数字Unicode值,所以在按字母顺序sorting时,它们不是最好的select。 对于string比较,序数会稍微快一些。
这取决于你想要什么,虽然我会避开invariant文化,除非你确定你永远不会想要本地化其他语言的代码。 改用CurrentCulture。
此外,OrdinalIgnoreCase应该尊重数字,这可能是也可能不是你想要的。
非常简单的答案是,除非您使用土耳其语,否则不需要使用InvariantCulture。
请参阅以下链接:
在C#中ToUpper()和ToUpperInvariant()有什么区别?