这通常是最好使用StringComparison.OrdinalIgnoreCase或StringComparison.InvariantCultureIgnoreCase?

StackOverflow https://stackoverflow.com/questions/72696

  •  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.OrdinalStringComparison.OrdinalIgnoreCase 成员新的 StringComparison 枚举。这些强制执行一个字节的比较类似于 strcmp 这不仅可以避免的错误,从语言上的解释基本上是象征性的串,但提供了更好的业绩。

其他提示

这一切都取决于

比较unicode串是难:

执行Unicode字符串 搜索和比较,在文字 处理软件时必须考虑到 帐户的存在等 代码点。在没有这个 功能,用户在寻找一个 特别代码点列会 无法找到其他的视觉 不可区别的符,有一个 不同的,但是规范地等同, 代码点表示。

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


如果你试图2比较unicode串在一种情况不敏感的方式,并希望它的工作 无处不在, 你有一个不可能的问题。

经典的例子是的 土耳其的我, ,这时候也头字母大写。成为我(注意点)

通过默认。净框架通常使用 CurrentCulture 为串相关的功能,具有非常重要的例外的 .Equals 使用的序号(逐字节)进行比较。

这导致,通过设计,到各种串职能,行为不同,这取决于计算机的文化。


尽管如此,有时我们希望有一个"一般性目的",情况不敏感,比较。

例如,你可能会想你的串比较的同样的表现方式,无论什么计算机的安装应用程序。

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

  1. 设置文化的明确和执行一个情形比较不敏感的使用unicode等同的规则。
  2. 设置文化的不变的文化和执行情况比较不敏感的使用unicode等同的规则。
  3. 使用 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应该遵守的数字,这可以或不可以你想要什么。

非常简单的答案是,除非你使用土耳其语,你不需要使用特定元素.

请参阅以下链接:

C#之间的区别是什么大写()和ToUpperInvariant()?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top