it-swarm.cn

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

我有一些像这样的代码:

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

我不关心这个案子。我应该使用OrdinalIgnoreCaseInvariantCultureIgnoreCaseCurrentCultureIgnoreCase吗?

138
Dave Haynes

较新的.Net Docs现在有一个表格可以帮助您确定最适合您的情况。

来自MSDN的“ 在Microsoft .NET 2.0中使用字符串的新建议

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

151
Robert Taylor

这完全取决于

比较unicode字符串很难:

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

见: http://en.wikipedia.org/wiki/Unicode_equivalence


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

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

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

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


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

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

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

  1. 明确设置区域性,并使用unicode等效性规则执行不区分大小写的比较。
  2. 将文化设置为Invariant Culture并使用unicode等效规则执行不区分大小写的比较。
  3. 使用 OrdinalIgnoreCase ,它将使用InvariantCulture对字符串进行大写,然后逐字节进行比较。

Unicode等价规则很复杂,这意味着使用方法1)或2)比OrdinalIgnoreCase更昂贵。 OrdinalIgnoreCase不执行任何特殊的unicode规范化这一事实意味着某些字符串在计算机屏幕上以相同的方式呈现,不会被认为是相同的。例如:"\u0061\u030a""\u00e5"都渲染å。但是,在序数比较中将被视为不同。

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

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

Microsoft提供了他们的 一套建议 和明确的指导方针。但是,在解决这些问题之前理解unicode等价的概念非常重要。

此外,请记住,OrdinalIgnoreCase是一种 非常特殊的野兽 ,它选择和选择一些序数比较与一些混合的词典方面。这可能令人困惑。

56
Sam Saffron

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

8
chessguy

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

3
Bullines

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

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

1
Joel Coehoorn

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

请参阅以下链接:

在C#中,ToUpper()和ToUpperInvariant()有什么区别?

0
TheMoot