我有一些像这样的代码:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
我不关心这个案子。我应该使用OrdinalIgnoreCase
,InvariantCultureIgnoreCase
还是CurrentCultureIgnoreCase
?
答案 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.OrdinalIgnoreCase
或StringComparison
成员开始指定重载。它们强制执行类似于strcmp
的逐字节比较,这不仅避免了对基本上符号字符串的语言解释的错误,而且提供了更好的性能。
答案 1 :(得分:56)
比较unicode字符串很难:
Unicode字符串的实现 在文本中搜索和比较 处理软件必须考虑到 帐户存在等价物 代码点。在没有这个的情况下 功能,用户搜索 特定的代码点序列会 无法在视觉上找到其他 无法区分的字形有一个 不同的,但规范等价的, 代码点表示。
请参阅:http://en.wikipedia.org/wiki/Unicode_equivalence
如果您尝试以不区分大小写的方式比较2个unicode字符串并希望它能够无处不在,那么您就有了一个不可能的问题。
经典的例子是Turkish i,当大写成为İ时(注意点)
默认情况下,.Net框架通常使用CurrentCulture作为字符串相关函数,.Equals
使用序数(逐字节)比较的非常重要的例外。
根据设计,这导致各种字符串函数根据计算机的文化而表现不同。
尽管如此,有时我们想要一个“通用”,不区分大小写的比较。
例如,无论您的应用程序安装在哪台计算机上,您都可能希望字符串比较的行为方式相同。
为实现这一目标,我们有3个选择:
Unicode等价规则很复杂,这意味着使用方法1)或2)比OrdinalIgnoreCase
更昂贵。 OrdinalIgnoreCase
不执行任何特殊的unicode规范化的事实意味着某些字符串在计算机屏幕上以相同的方式呈现,将不会被认为是相同的。例如:"\u0061\u030a"
和"\u00e5"
都呈现å。但是,在序数比较中将被视为不同。
您选择的很大程度上取决于您正在构建的应用程序。
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()?