String Equality - Что здесь происходит?
Чтобы отладить проблему в моем коде, я объявил следующие две строки, считая, что они будут эквивалентны:
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
а? Почему они не равны?
изменить:
Мне нужно использовать "отпечаток" в качестве базы. Пользователь вводит строку. Я просто использую "newPrint" в качестве временной переменной для удержания урезанного/выровненного значения. печать - ожидаемый результат.
Ответы
Ответ 1
Действительно, они не эквивалентны. Я скопировал два значения, а newPrint
имеет длину 41, тогда как print
имеет длину 40. Первый символ newPrint
- это символ с значением ASCII 14. Интересно, что это было перенесено из вашего непосредственного окна к SO к моей LINQPad.
print.Length
40
newPrint.Length
41
(sbyte)print[0]
56
(sbyte)newPrint[0]
14
Это фактически не имеет ничего общего с вашими вызовами Trim
и Replace
, но с тем фактом, что вы используете thumbprint
вместо print
в качестве базы. Я могу только предположить, что thumbprint
содержит этот дополнительный символ. Откуда я не знаю. Если вы измените вторую строку, чтобы использовать print
вместо thumbprint
, вы получите ожидаемый результат.
Ответ 2
Строки, которые вы публикуете, не равны.
Просто сделайте следующее:
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
работает:
Сравнение использует текущую культуру для получения специфических для культуры информации, такой как правила обсадной колонны и алфавитный порядок отдельные символы
Ответ 3
В вопросе есть что-то не так. Если нет, пл. укажите полную среду, как я пробовал это на 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));
}