通常最好使用 – StringComparison.OrdinalIgnoreCase或StringComparison.InvariantCultureIgnoreCase?

我有这样的代码:

If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then DoSomething() End If 

我不在乎这个情况。 我应该使用OrdinalIgnoreCaseInvariantCultureIgnoreCaseCurrentCultureIgnoreCase

从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

  1. 显式设置文化并使用unicode等价规则执行不区分大小写的比较。
  2. 将文化设置为不变文化,并使用unicode等价规则执行不区分大小写的比较。
  3. 使用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()有什么区别?