哪个通常最好用 - StringComparison.OrdinalIgnoreCase或StringComparison.InvariantCultureIgnoreCase?

Dav*_*nes 145 .net vb.net localization

我有一些像这样的代码:

If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
    DoSomething()
End If
Run Code Online (Sandbox Code Playgroud)

我不关心这个案子.我应该使用OrdinalIgnoreCase,InvariantCultureIgnoreCaseCurrentCultureIgnoreCase

Rob*_*lor 160

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

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

  • 举一个不同的例子,考虑两个字符串"Straße"和"STRASSE".当使用`OrdinalIgnoreCase`时,`Equals`返回`false`,而`InvariantCultureIgnoreCase`表示它们是相等的. (113认同)
  • 更新链接:https://docs.microsoft.com/en-us/dotnet/standard/base-types/best-practices-strings (2认同)
  • 您使用什么文化?在我的机器上(Win 11、.Net 6.0.8、de-DE 区域性),我对“CurrentCultureIgnoreCase”、“OrdinalIgnoreCase”、“InvariantCultureIgnoreCase”得到“false”。但是 `string.Equals("Straße", "STRAẞE", StringComparison.InvariantCultureIgnoreCase).Dump();` 和 `string.Equals("Straße", "STRAẞE", StringComparison.CurrentCultureIgnoreCase).Dump();` 都返回‘真实’。请注意,“STRAẞE”使用的是 2008 年标准化的大写“ẞ”。 (2认同)

Sam*_*ron 60

这完全取决于

比较unicode字符串很难:

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

请参阅:http://en.wikipedia.org/wiki/Unicode_equivalence


如果你想在不区分大小写的方式来比较2个unicode字符串,并希望它的工作无处不在,你有一个不可能的问题.

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

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

这通过设计导致各种字符串函数根据计算机的文化而表现不同.


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

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

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

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

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

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

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

Microsoft提供了一系列明确指导的建议.但是,在解决这些问题之前理解unicode等价的概念非常重要.

此外,请记住,OrdinalIgnoreCase是一种非常特殊的野兽,它选择和选择一些序数比较与词典方面的混合.这可能令人困惑.