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
更接近)