关于.net:哪个通常最好用 – StringComparison.OrdinalIgnoreCase或StringComparison.InvariantCultureIgnoreCase?

Which is generally best to use — StringComparison.OrdinalIgnoreCase or StringComparison.InvariantCultureIgnoreCase?

我有一些这样的代码:

1
2
3
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
    DoSomething()
End If

我不在乎这个案子。我应该使用OrdinalIgnoreCaseInvariantCultureIgnoreCase还是CurrentCultureIgnoreCase


更新的.NET文档现在有一个表来帮助您决定在您的情况下使用哪一个是最好的。

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

Summary: Code owners previously using the InvariantCulture for string comparison, casing, and sorting should strongly consider using a new set of String overloads in Microsoft .NET 2.0. Specifically, data that is designed to be culture-agnostic and linguistically irrelevant should begin specifying overloads using either the StringComparison.Ordinal or StringComparison.OrdinalIgnoreCase members of the new StringComparison enumeration. These enforce a byte-by-byte comparison similar to strcmp that not only avoids bugs from linguistic interpretation of essentially symbolic strings, but provides better performance.


一切都取决于

比较unicode字符串很困难:

The implementation of Unicode string
searches and comparisons in text
processing software must take into
account the presence of equivalent
code points. In the absence of this
feature, users searching for a
particular code point sequence would
be unable to find other visually
indistinguishable glyphs that have a
different, but canonically equivalent,
code point representation.

参见:http://en.wikipedia.org/wiki/unicode_等效

如果您试图以不区分大小写的方式比较2个Unicode字符串,并希望它在任何地方都能工作,那么您就遇到了一个不可能的问题。

典型的例子是土耳其语I,当大写字母变成?(注意圆点)

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

根据设计,这将导致不同的字符串函数根据计算机的文化表现不同。

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

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

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

  • 显式设置区域性,并使用Unicode等效规则执行不区分大小写的比较。
  • 将区域性设置为不变区域性,并使用Unicode等效规则执行不区分大小写的比较。
  • 使用OrdinalIgnoreCase,它将使用不变区域性大写字符串,然后执行逐字节比较。
  • Unicode等价规则很复杂,这意味着使用方法1)或2)比OrdinalIgnoreCase更昂贵。OrdinalIgnoreCase不执行任何特殊的Unicode规范化,这意味着在计算机屏幕上以相同方式呈现的某些字符串将不被视为相同的。例如:"\u0061\u030a""\u00e5"都渲染?。但是,在序数比较中,将被认为是不同的。

    您选择哪一个很大程度上取决于您正在构建的应用程序。

    • 如果我写的是一个只被土耳其用户使用的业务应用程序,我肯定会使用方法1。
    • 如果我只需要一个简单的"假"不区分大小写的比较,比如数据库中的列名(通常是英语),我可能会使用方法3。

    微软有一套明确的建议。然而,在解决这些问题之前,了解Unicode等价的概念是非常重要的。

    另外,请记住,序数对齐情况是一种非常特殊的野兽,即与词典学方面的一些混合情况相比,选择一点序数。这可能会令人困惑。


    对于这一点,msdn给出了一些非常明确的建议:http://msdn.microsoft.com/en-us/library/ms973919.aspx


    我想这取决于你的情况。因为顺序比较实际上是在查看字符的数字Unicode值,所以当您按字母顺序排序时,它们不是最佳选择。不过,对于字符串比较而言,序数要快一点。


    这取决于你想要什么,尽管我会避开不变的区域性,除非你非常确定你永远不想本地化其他语言的代码。改用当前区域性。

    另外,ordinalAlignoreCase应该考虑数字,这可能是您想要的,也可能不是您想要的。


    很简单的答案是,除非你使用土耳其语,否则你不需要使用不变的文化。

    请参见以下链接:

    在C中,toupper()和toupperInvariant()有什么区别?