字符串比较:InvariantCultureIgnoreCase与OrdinalIgnoreCase?

时间:2010-05-01 11:00:08

标签: c# string

哪种代码更好:

int index = fileName.LastIndexOf(".", StringComparison.InvariantCultureIgnoreCase);

int index = fileName.LastIndexOf(".", StringComparison.OrdinalIgnoreCase);

4 个答案:

答案 0 :(得分:218)

两种代码都不会更好。他们做不同的事情,所以他们擅长不同的事情。

InvariantCultureIgnoreCase使用基于英语的比较规则,但没有任何区域差异。这对于仍然考虑到某些语言方面的中性比较是有益的。

OrdinalIgnoreCase比较没有文化方面的字符代码。这对于精确比较(如登录名)很有用,但不适用于排序包含éö等不常用字符的字符串。这也更快,因为在比较之前没有额外的规则要应用。

答案 1 :(得分:52)

FXCop通常更喜欢OrdinalIgnoreCase。但您的要求可能会有所不同。

对于英语,差别很小。当你徘徊于具有不同书面语言结构的语言时,这就变成了一个问题。我没有足够的经验给你更多。

OrdinalIgnoreCase

  

由String返回的StringComparer   OrdinalIgnoreCase属性对待   字符串中的字符   比较好像他们被转换了   使用约定大写   不变的文化,然后   执行简单的字节比较   这与语言无关。   这是最合适的   比较生成的字符串   以编程方式或比较时   不区分大小写的资源,例如   路径和文件名。   http://msdn.microsoft.com/en-us/library/system.stringcomparer.ordinalignorecase.aspx

InvariantCultureIgnoreCase

  

由String返回的StringComparer   InvariantCultureIgnoreCase属性   在语言上比较字符串   忽略案件的相关方式,但是   它不适合任何显示   特殊文化。它的主要   应用程序是在一个命令中的字符串   方式将是相同的   文化。   http://msdn.microsoft.com/en-us/library/system.stringcomparer.invariantcultureignorecase.aspx

     

不变的文化是   CultureInfo对象返回   InvariantCulture属性。

     

InvariantCultureIgnoreCase   property实际上返回一个实例   一个匿名类派生自   StringComparer类。

答案 2 :(得分:38)

如果你真的想只匹配点,那么StringComparison.Ordinal将是最快的,因为没有任何区别。

“Ordinal”不使用不适用于.等符号的文化和/或套管规则。

答案 3 :(得分:14)

您似乎正在进行文件名比较,因此我只想将OrdinalIgnoreCase 最接近添加到NTFS所做的事情(它不完全相同,但它比{{1}更近}})