C#字符串比较失败

25

我的应用程序在字符串比较时出现故障。我已经设置了断点,然后在 Visual Studio 的中间窗口中进行了以下实验。

subject

"<#MethodResourceObjectives​>"

subject.Contains("<#Method")

true

subject.Contains("<#MethodResource")

true

subject.Contains("<#MethodResourceObjectives")

true

subject.Contains("<#MethodResourceObjectives>")

false

这似乎是不可能的,有人知道可能发生了什么吗?


5
">" 可能是不同的字符,但它们具有相同的视觉表示形式吗? - Codor
2
也许他在骗你! - Hamid Pourjam
@joe,针对你的问题修复,你可以更改主题值与其进行比较的常量值,因为其他人已经提到它包含不可打印字符。 - Satyajit
2个回答

57

听起来在"s"和">"之间可能有一个无法打印的字符。

我通常使用类似这样的代码来展示字符串的真实内容:

for (int i = 0; i < text.Length; i++)
{
    Console.WriteLine("{0:x4}", (int) text[i]);
}

当然,从即时窗口的角度来看,这不太方便 :(

实际上,将您的文本复制并粘贴到我的Unicode Explorer(页面底部)中,看起来确实是问题所在 - 您在>之前有一个U+200B(零宽空格)。您需要找出它来自哪里。


3
有。我将他的字符串复制并粘贴到dotnetfiddle中进行检查,发现在>之前有一个字符显示出来。 - AndrewC
2
@leppie,为什么在“>”之后的任何(可打印/不可打印)符号中,subject.Contains("<#MethodResourceObjectives>") == false会成立? - Sinatr
@AndrewC:是的,我也刚发现了这个问题,并在答案中加以说明。 - Jon Skeet
1
@Sinatr:因为常量字符串可能在末尾包含无法打印的字符,导致测试失败。 - leppie
3
@leppie,哦,你是指在Contains函数调用本身中的不可打印字符。但这样它就可以出现在最后一个测试的任何位置,因为它是不可打印的 =P - Sinatr
1
s > "-s>" s%3E%22-s%u200B%3E%22s > "-s>" s%3E%22-s%u200B%3E%22 - Biniam Eyakem

27

复制/粘贴文本后,我可以确认出现了相同的行为。

输出:

"<#MethodResourceObjectives>".ToCharArray()
{char[27]}
    [0]: 60 '<'
    [1]: 35 '#'
    [2]: 77 'M'
    [3]: 101 'e'
    [4]: 116 't'
    [5]: 104 'h'
    [6]: 111 'o'
    [7]: 100 'd'
    [8]: 82 'R'
    [9]: 101 'e'
    [10]: 115 's'
    [11]: 111 'o'
    [12]: 117 'u'
    [13]: 114 'r'
    [14]: 99 'c'
    [15]: 101 'e'
    [16]: 79 'O'
    [17]: 98 'b'
    [18]: 106 'j'
    [19]: 101 'e'
    [20]: 99 'c'
    [21]: 116 't'
    [22]: 105 'i'
    [23]: 118 'v'
    [24]: 101 'e'
    [25]: 115 's'
    [26]: 62 '>'

那么

subject.ToCharArray()
{char[28]}
    [0]: 60 '<'
    [1]: 35 '#'
    [2]: 77 'M'
    [3]: 101 'e'
    [4]: 116 't'
    [5]: 104 'h'
    [6]: 111 'o'
    [7]: 100 'd'
    [8]: 82 'R'
    [9]: 101 'e'
    [10]: 115 's'
    [11]: 111 'o'
    [12]: 117 'u'
    [13]: 114 'r'
    [14]: 99 'c'
    [15]: 101 'e'
    [16]: 79 'O'
    [17]: 98 'b'
    [18]: 106 'j'
    [19]: 101 'e'
    [20]: 99 'c'
    [21]: 116 't'
    [22]: 105 'i'
    [23]: 118 'v'
    [24]: 101 'e'
    [25]: 115 's'
    [26]: 8203 '​'  <--------- input string contains 'garbage'
    [27]: 62 '>'

9
我将其添加为社区维基,因为Jon Skeet已经指出了这个问题。对于评论来说太长了。 - leppie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接