字符串比较:InvariantCultureIgnoreCase vs OrdinalIgnoreCase?

哪种代码更好:

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

int index = fileName.LastIndexOf(".", StringComparison.OrdinalIgnoreCase);
130357 次浏览

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

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

OrdinalIgnoreCase

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

InvariantCultureIgnoreCase

对象返回的StringComparer InvariantCultureIgnoreCase财产 在语言上比较字符串 忽略case的相关方式,但是 它不适合在任何地方展示 特定的文化。它的主要 中的字符串排序 这样它们就完全相同了 文化。 http://msdn.microsoft.com/en-us/library/system.stringcomparer.invariantcultureignorecase.aspx < / p >

不变区域性是 对象返回的CultureInfo对象 InvariantCulture财产。< / p > < p > InvariantCultureIgnoreCase 属性实际返回一个实例 类派生的匿名类的 StringComparer类。< / p >

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

InvariantCultureIgnoreCase使用基于英语的比较规则,但没有任何区域差异。这对于考虑到一些语言方面的中性比较来说是很好的。

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

你似乎在做文件名比较,所以我只会添加OrdinalIgnoreCase最亲密的到NTFS所做的(它不完全相同,但它比InvariantCultureIgnoreCase更接近)

如果你真的只想匹配点,那么StringComparison.Ordinal将是最快的,因为没有大小写差异。

"Ordinal"不使用区域性和/或大小写规则,这些规则在.等符号上是不适用的。