String.Compare与OrdinalIgnoreCase的奇怪行为

时间:2017-09-07 12:15:16

标签: .net

MSDN在StringComparison.OrdinalIgnoreCase上说:

  

OrdinalIgnoreCase属性返回的TheStringComparer将字符串中的字符视为比较,就好像它们使用不变文化的约定转换为大写一样,然后执行独立于语言的简单字节比较。 这在比较以编程方式生成的字符串或比较不区分大小写的资源(如路径和文件名)时最合适。

https://msdn.microsoft.com/en-us/library/e6883c06(v=vs.110).aspxhttps://msdn.microsoft.com/en-us/library/system.stringcomparer.ordinalignorecase%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

然而,当我尝试比较时

String.Compare("‎a","A", StringComparison.OrdinalIgnoreCase)

返回的值为1而不是0

更奇怪的是:

String.Compare("‎1","1", StringComparison.OrdinalIgnoreCase)

虽然字符串相等,但也返回1

我错过了什么?

2 个答案:

答案 0 :(得分:2)

在挖掘一小时后找到原因:原来其中一个字符串包含一个不可见的字符%e2%80%8e(LEFT-TO-RIGHT MARK),仅在获取字符串并将其转换为数组时可见。

答案 1 :(得分:1)

我不确定你为什么会得到这个结果。当我通过LinqPad运行此代码时,我得到0。

如果外壳不相关,您可以尝试其他重载String.Compare(string, string, bool)

String.Compare("‎a","A", true);
String.Compare("‎1","1", true);