string比较:InvariantCultureIgnoreCase与OrdinalIgnoreCase?

哪个会更好的代码:

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

要么

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

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

这两个代码总是更好。 他们做不同的事情,所以擅长不同的事情。

InvariantCultureIgnoreCase使用基于英文的比较规则,但没有任何区域变化。 这对于中立的比较是有好处的,它仍然考虑到一些语言方面。

OrdinalIgnoreCase比较没有文化方面的字符代码。 这对于精确比较是很好的,比如login名,但是不能用于sortingstring,如éö 。 这也比较快,因为在比较之前没有额外的规则。

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

对于英语来说,几乎没有什么区别。 当你漫步到具有不同书面语言结构的语言中时,这成为一个问题。 我没有足够的经验给你比这更多。

OrdinalIgnoreCase

由OrdinalIgnoreCase属性返回的StringComparer将string中的字符作为比较,如同使用不变文化的约定将其转换为大写字母,然后执行与语言无关的简单字节比较。 比较以编程方式生成的string或比较不区分大小写的资源(如path和文件名)时,这是最合适的。 http://msdn.microsoft.com/en-us/library/system.stringcomparer.ordinalignorecase.aspx

InvariantCultureIgnoreCase

由InvariantCultureIgnoreCase属性返回的StringComparer以忽略大小写的语言相关方式比较string,但不适合在任何特定文化中显示。 它的主要用途是以一种跨文化相同的方式来排列string。 http://msdn.microsoft.com/en-us/library/system.stringcomparer.invariantcultureignorecase.aspx

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

InvariantCultureIgnoreCase属性实际上返回从StringComparer类派生的匿名类的实例。

你似乎在做文件名比较,所以我只是补充说, OrdinalIgnoreCase最接近 NTFS(它不完全相同,但它比InvariantCultureIgnoreCase更接近)