关于c#:字符串比较:InvariantCultureIgnoreCase与OrdinalIgnoreCase?

String comparison: InvariantCultureIgnoreCase vs OrdinalIgnoreCase?

本问题已经有最佳答案,请猛点这里访问。

哪个代码更好:

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

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


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

InvariantCultureIgnoreCase使用基于英语的比较规则,但不存在任何地区差异。这对于一个仍然考虑到一些语言方面的中立比较是有益的。

OrdinalIgnoreCase比较了没有文化方面的字符代码。这有助于进行精确的比较,如登录名,但不适用于使用诸如é?等异常字符对字符串进行排序。这也更快,因为在比较之前没有额外的规则可以应用。


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

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

顺序排列情况

The StringComparer returned by the
OrdinalIgnoreCase property treats
the characters in the strings to
compare as if they were converted
to uppercase using the conventions
of the invariant culture, and then
performs a simple byte comparison
that is independent of language.
This is most appropriate when
comparing strings that are generated
programmatically or when comparing
case-insensitive resources such as
paths and filenames.
http://msdn.microsoft.com/en-us/library/system.stringcomparer.ordinalignorecase.aspx

不变文化特征酶

The StringComparer returned by the
InvariantCultureIgnoreCase property
compares strings in a linguistically
relevant manner that ignores case, but
it is not suitable for display in any
particular culture. Its major
application is to order strings in a
way that will be identical across
cultures.
http://msdn.microsoft.com/en-us/library/system.stringcomparer.invariantcultureignorecase.aspx

The invariant culture is the
CultureInfo object returned by the
InvariantCulture property.

The InvariantCultureIgnoreCase
property actually returns an instance
of an anonymous class derived from the
StringComparer class.


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

"序数"不使用文化和/或大小写规则,这些规则在类似于.的符号上无论如何都不适用。


你好像在做文件名比较,所以我想补充一下,OrdinalIgnoreCase和ntfs最接近(虽然不完全相同,但比InvariantCultureIgnoreCase更接近)。