这通常是最好使用StringComparison.OrdinalIgnoreCase或StringComparison.InvariantCultureIgnoreCase?
-
09-06-2019 - |
题
我有一些这样的代码:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
我不关心的情况。我应该使用 OrdinalIgnoreCase
, InvariantCultureIgnoreCase
, 或 CurrentCultureIgnoreCase
?
解决方案
更新的。净的文档,现在有一个表,以帮助决定哪些是最佳使用在你的情况。
从MSDN的"新建议使用的字符串中Microsoft。网2.0"
摘要:代码的业主,以前使用的
InvariantCulture
为串比较,壳体,分类应当考虑采用一套新的String
重载于Microsoft。网2.0. 具体而言,数据,目的是将文化的不可知的和语言无关紧要 应该开始指定超载使用StringComparison.Ordinal
或StringComparison.OrdinalIgnoreCase
成员新的StringComparison
枚举。这些强制执行一个字节的比较类似于strcmp
这不仅可以避免的错误,从语言上的解释基本上是象征性的串,但提供了更好的业绩。
其他提示
这一切都取决于
比较unicode串是难:
执行Unicode字符串 搜索和比较,在文字 处理软件时必须考虑到 帐户的存在等 代码点。在没有这个 功能,用户在寻找一个 特别代码点列会 无法找到其他的视觉 不可区别的符,有一个 不同的,但是规范地等同, 代码点表示。
参见: http://en.wikipedia.org/wiki/Unicode_equivalence
如果你试图2比较unicode串在一种情况不敏感的方式,并希望它的工作 无处不在, 你有一个不可能的问题。
经典的例子是的 土耳其的我, ,这时候也头字母大写。成为我(注意点)
通过默认。净框架通常使用 CurrentCulture 为串相关的功能,具有非常重要的例外的 .Equals
使用的序号(逐字节)进行比较。
这导致,通过设计,到各种串职能,行为不同,这取决于计算机的文化。
尽管如此,有时我们希望有一个"一般性目的",情况不敏感,比较。
例如,你可能会想你的串比较的同样的表现方式,无论什么计算机的安装应用程序。
为了实现这一目标,我们有3个选择:
- 设置文化的明确和执行一个情形比较不敏感的使用unicode等同的规则。
- 设置文化的不变的文化和执行情况比较不敏感的使用unicode等同的规则。
- 使用 OrdinalIgnoreCase 这将大写的字符串中使用的特定元素,然后执行一个字节比较。
Unicode的等同规则是复杂的,这意味着采用方法1)或2)是昂贵的多 OrdinalIgnoreCase
.事实上, OrdinalIgnoreCase
不执行任何特别unicode正常化,意味着一些字符串呈现同样的方式在计算机屏幕上 将不会 被认为是相同的。例如: "\u0061\u030a"
和 "\u00e5"
这两个呈现埃。然而在序比较将被认为是不同的。
这你的选择很大程度上取决于应用程序。
- 如果我写的是一线的业务应用程序,它只是用于由土耳其用户,我将确保使用方法1。
- 如果我只是需要一个简单的"假"的情况不敏感的比较,为说一栏中的名称数据库,这通常是英文,我可能会使用方法3。
Microsoft具有他们的 设定的建议 有明确的指导方针。然而,它是真正重要的是要理解的概念等同unicode之前接近这些问题。
此外,请记住,OrdinalIgnoreCase是 非常特别的一种 的野兽,被挑选一位的序号进行比较有一些混合在字典式方面。这可能会造成混淆。
MSDN使得一些相当明确的建议: http://msdn.microsoft.com/en-us/library/ms973919.aspx
我想这取决于你的情况。因为序号的比较实际上是看着的人物数字Unicode的价值观,他们不会是最好的选择当你排序字母顺序排列。字符串比较,但是,顺序将是一点点的速度更快。
这取决于你想要什么,但我会回避的特定元素,除非你是 非常 确保你将永远不会想要确定代码,用于其他语言。使用CurrentCulture代替。
此外,OrdinalIgnoreCase应该遵守的数字,这可以或不可以你想要什么。