哪个通常最好用 - StringComparison.OrdinalIgnoreCase或StringComparison.InvariantCultureIgnoreCase?

时间:2008-09-16 14:11:39

标签: .net vb.net localization

我有一些像这样的代码:

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

我不关心这个案子。我应该使用OrdinalIgnoreCaseInvariantCultureIgnoreCase还是CurrentCultureIgnoreCase

6 个答案:

答案 0 :(得分:151)

<强> Newer .Net Docs now has a table to help you decide which is best to use in your situation.

来自MSDN的“New Recommendations for Using Strings in Microsoft .NET 2.0

  

摘要:之前使用InvariantCulture进行字符串比较,大小写和排序的代码所有者应该强烈考虑在Microsoft .NET 2.0中使用一组新的String重载。 具体而言,设计为与文化无关且与语言无关的数据应使用新StringComparison.Ordinal枚举的StringComparison.OrdinalIgnoreCaseStringComparison成员开始指定重载。它们强制执行类似于strcmp的逐字节比较,这不仅避免了对基本上符号字符串的语言解释的错误,而且提供了更好的性能。

答案 1 :(得分:56)

一切都取决于

比较unicode字符串很难:

  

Unicode字符串的实现   在文本中搜索和比较   处理软件必须考虑到   帐户存在等价物   代码点。在没有这个的情况下   功能,用户搜索   特定的代码点序列会   无法在视觉上找到其他   无法区分的字形有一个   不同的,但规范等价的,   代码点表示。

请参阅:http://en.wikipedia.org/wiki/Unicode_equivalence


如果您尝试以不区分大小写的方式比较2个unicode字符串并希望它能够无处不在,那么您就有了一个不可能的问题。

经典的例子是Turkish i,当大写成为İ时(注意点)

默认情况下,.Net框架通常使用CurrentCulture作为字符串相关函数,.Equals使用序数(逐字节)比较的非常重要的例外。

根据设计,这导致各种字符串函数根据计算机的文化而表现不同。


尽管如此,有时我们想要一个“通用”,不区分大小写的比较。

例如,无论您的应用程序安装在哪台计算机上,您都可能希望字符串比较的行为方式相同。

为实现这一目标,我们有3个选择:

  1. 显式设置区域性,并使用unicode等效性规则执行不区分大小写的比较。
  2. 将文化设置为Invariant Culture并使用unicode等效规则执行不区分大小写的比较。
  3. 使用OrdinalIgnoreCase,它将使用InvariantCulture将字符串置为大写,然后逐字节进行比较。
  4. Unicode等价规则很复杂,这意味着使用方法1)或2)比OrdinalIgnoreCase更昂贵。 OrdinalIgnoreCase不执行任何特殊的unicode规范化的事实意味着某些字符串在计算机屏幕上以相同的方式呈现,将不会被认为是相同的。例如:"\u0061\u030a""\u00e5"都呈现å。但是,在序数比较中将被视为不同。

    您选择的很大程度上取决于您正在构建的应用程序。

    • 如果我正在编写仅供土耳其用户使用的业务线应用程序,我一定会使用方法1.
    • 如果我只需要一个简单的“假”不区分大小写比较,比如说db中的列名,通常是英文,我可能会使用方法3.

    Microsoft的set of recommendations有明确的指导原则。但是,在解决这些问题之前理解unicode等价的概念非常重要。

    另外,请记住,OrdinalIgnoreCase是一个very special kind的野兽,它正在挑选和选择一些与词典方面混合的序数比较。这可能令人困惑。

答案 2 :(得分:8)

MSDN对此提出了一些非常明确的建议:http://msdn.microsoft.com/en-us/library/ms973919.aspx

答案 3 :(得分:3)

我想这取决于你的情况。由于序数比较实际上是在查看字符的数字Unicode值,因此当您按字母顺序排序时,它们将不是最佳选择。但是,对于字符串比较,序数会更快一些。

答案 4 :(得分:1)

这取决于你想要什么,虽然我会回避不变的文化,除非你非常确定你永远不会想要将其他语言的代码本地化。请改用CurrentCulture。

另外,OrdinalIgnoreCase应该尊重数字,这可能是你想要的,也可能不是。

答案 5 :(得分:0)

非常简单的答案是,除非您使用土耳其语,否则您不需要使用InvariantCulture。

请参阅以下链接:

In C# what is the difference between ToUpper() and ToUpperInvariant()?