为了调试我的代码中的问题,我已经声明了以下两个字符串,假设它们是等价的:
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'作为临时变量来保存修剪/上升值。印刷是预期的结果。
答案 0 :(得分:28)
实际上,它们并不等同。我复制了两个值,newPrint
的长度为41,而print
的长度为40. newPrint
的第一个字符是一个ASCII值为14.的字符。有趣的是,这有已从您的即时窗口转移到我的LINQPad。
print.Length
40
newPrint.Length
41
(sbyte)print[0]
56
(sbyte)newPrint[0]
14
这实际上与您的Trim
和Replace
来电无关,但事实上您使用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));
}