字符串平等 - 这里发生了什么?

时间:2012-09-13 13:02:32

标签: c# string

为了调试我的代码中的问题,我已经声明了以下两个字符串,假设它们是等价的:

String print = "8A9B485ECDC56B6E0FD023D6994A57EEC49B0717";
String newPrint = thumbprint.Trim().Replace(" ", "").ToUpper();

我发现他们不是。太好了,这是我的问题的根源。但是,我正在检查即时窗口中的内容(在声明后面的行)并且不明白发生了什么。这是输出:

print
"8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"
newPrint
"‎8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"
String.Compare(print, newPrint);
0
print == newPrint
false
print.Equals(newPrint)
false

是吗?他们为什么不相等?

编辑:

我需要使用'thumbprint'作为基础。这是用户输入的字符串。我只是使用'newPrint'作为临时变量来保存修剪/上升值。印刷是预期的结果。

3 个答案:

答案 0 :(得分:28)

实际上,它们并不等同。我复制了两个值,newPrint的长度为41,而print的长度为40. newPrint的第一个字符是一个ASCII值为14.的字符。有趣的是,这有已从您的即时窗口转移到我的LINQPad。

print.Length
40
newPrint.Length
41
(sbyte)print[0]
56
(sbyte)newPrint[0]
14

这实际上与您的TrimReplace来电无关,但事实上您使用thumbprint而不是print作为基础。我只能假设thumbprint包含该附加字符。它来自哪里我不知道。如果您要更改第二行以使用print而不是thumbprint,那么您将得到预期的结果。

答案 1 :(得分:18)

您发布的字符串相等。 就这样做:

string val   = "8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"; 
string val1  = "‎8A9B485ECDC56B6E0FD023D6994A57EEC49B0717";
var bt = System.Text.Encoding.UTF8.GetBytes(val);
var bt_1 = System.Text.Encoding.UTF8.GetBytes(val1);

您将看到第二个数组在开始中包含更多元素。

226 
128 
142

此3元素内容相等后。

String.Compare的作用原因是:

  

比较使用当前的文化来获得特定文化   套管规则和字母顺序等信息   个人角色

答案 2 :(得分:0)

这个问题有问题。如果没有,请pl。指定完整的环境,因为我在MS .NET上尝试过,但不是在Mono上。 尝试这种方法: - 我没有错误,trace语句的输出是

  

字符串相等= True

void TestString()
{
    String print = "8A9B485ECDC56B6E0FD023D6994A57EEC49B0717";
    String newPrint = print.Trim().Replace(" ", "").ToUpper();
    Trace.TraceInformation("Strings are equal = {0}", (print == newPrint) && (print.Equals(newPrint)));
    Debug.Assert(print == newPrint);
    Debug.Assert(print.Equals(newPrint));
}