我有一些这样的代码:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
我不关心这个案子。我应该使用OrdinalIgnoreCase
,InvariantCultureIgnoreCase
还是CurrentCultureIgnoreCase
?
我有一些这样的代码:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
我不关心这个案子。我应该使用OrdinalIgnoreCase
,InvariantCultureIgnoreCase
还是CurrentCultureIgnoreCase
?
较新的 .Net Docs 现在有一个表格,可帮助您确定最适合您的情况。
来自 MSDN 的“在 Microsoft .NET 2.0 中使用字符串的新建议”
InvariantCulture
总结:以前使用for 字符串比较、大小写和排序的代码所有者应该强烈考虑String
在 Microsoft .NET 2.0 中使用一组新的重载。具体来说,设计为与文化无关和语言无关的数据应该开始使用新枚举的StringComparison.Ordinal
或StringComparison.OrdinalIgnoreCase
成员来指定重载。StringComparison
这些强制执行类似于这样的逐字节比较strcmp
,不仅避免了基本符号字符串的语言解释中的错误,而且提供了更好的性能。
比较 unicode 字符串很难:
文本处理软件中 Unicode 字符串搜索和比较的实现必须考虑到等效代码点的存在。在没有此功能的情况下,搜索特定代码点序列的用户将无法找到具有不同但规范等效的代码点表示的其他视觉上无法区分的字形。
见:http ://en.wikipedia.org/wiki/Unicode_equivalence
如果您尝试以不区分大小写的方式比较 2 个 unicode 字符串并希望它在任何地方都能正常工作,那么您将遇到一个不可能的问题。
经典的例子是土耳其语 i,当大写时变成 İ (注意点)
默认情况下,.Net 框架通常将CurrentCulture用于与字符串相关的函数,但一个非常重要的例外.Equals
是使用序数(逐字节)比较。
根据设计,这会导致各种字符串函数的行为因计算机文化而异。
尽管如此,有时我们想要一个“通用”、不区分大小写的比较。
例如,您可能希望字符串比较的行为方式相同,无论您的应用程序安装在哪台计算机上。
为此,我们有 3 个选项:
Unicode 等价规则很复杂,这意味着使用方法 1) 或 2) 比OrdinalIgnoreCase
. OrdinalIgnoreCase
不执行任何特殊的 unicode 规范化的事实意味着某些在计算机屏幕上以相同方式呈现的字符串将不会被视为相同。例如:"\u0061\u030a"
并且"\u00e5"
两者都呈现å。然而,在序数比较中将被认为是不同的。
您选择哪个在很大程度上取决于您正在构建的应用程序。
Microsoft有一套带有明确指导方针的建议。但是,在解决这些问题之前了解 unicode 等价的概念非常重要。
另外,请记住,OrdinalIgnoreCase 是一种非常特殊的野兽,它在字典方面与一些混合的排序比较。这可能会令人困惑。
我想这取决于你的情况。由于序号比较实际上是在查看字符的数字 Unicode 值,因此当您按字母顺序排序时,它们不是最佳选择。但是,对于字符串比较,序数会快一点。
这取决于您想要什么,尽管我会回避不变文化,除非您非常确定您永远不想本地化其他语言的代码。请改用 CurrentCulture。
此外,OrdinalIgnoreCase 应该尊重数字,这可能是也可能不是您想要的。