188

我有一些这样的代码:

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

我不关心这个案子。我应该使用OrdinalIgnoreCase,InvariantCultureIgnoreCase还是CurrentCultureIgnoreCase?

4

5 回答 5

202

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

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

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

于 2008-09-16T14:16:42.160 回答
69

这一切都取决于

比较 unicode 字符串很难:

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

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


如果您尝试以不区分大小写的方式比较 2 个 unicode 字符串并希望它在任何地方都能正常工作那么您将遇到一个不可能的问题。

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

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

根据设计,这会导致各种字符串函数的行为因计算机文化而异。


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

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

为此,我们有 3 个选项:

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

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

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

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

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

另外,请记住,OrdinalIgnoreCase 是一种非常特殊的野兽,它在字典方面与一些混合的排序比较。这可能会令人困惑。

于 2011-06-20T02:16:53.377 回答
4

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

于 2008-09-16T14:17:22.130 回答
1

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

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

于 2008-09-16T14:13:00.487 回答
-2

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

请参阅以下链接:

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

于 2012-07-18T19:32:51.783 回答