C # оператор равенства строк возвращает false, но я уверен, что это должно быть так ... Что? - PullRequest
5 голосов
/ 01 апреля 2010

Я пытаюсь написать модульный тест для кода, который генерирует большой объем текста. Я столкнулся с проблемой, когда «ожидаемые» и «фактические» строки кажутся равными, но Assert.AreEqual выбрасывает, и оба оператора равенства и Equals() возвращают false. Результат GetHashCode() также отличается для обоих значений.

Однако размещение обеих строк в текстовых файлах и сравнение с DiffMerge говорит мне, что они одинаковы.

Кроме того, использование Encoding.ASCII.GetBytes() для обоих значений и затем SequenceEquals для сравнения результирующих байтовых массивов возвращает true.

Значения - 34 КБ каждое, поэтому я пока не буду их здесь приводить. Есть идеи? Я полностью в замешательстве.

Ответы [ 2 ]

10 голосов
/ 01 апреля 2010

Прокрутите char на char и найдите, что он думает иначе? Тот факт, что запись его на диск и сравнение ASCII / текста говорит мне, что это, вероятно, связано либо с возвратом каретки / переводом строки (что-то нормализуется при сохранении), либо с каким-то не-ASCII-символом (может быть, высокий Unicode), который будет удален при сохранении как ASCII.

5 голосов
/ 01 апреля 2010

Каковы типы кодирования файлов, которые вы вводите в DiffMerge? Если у вас есть символы, которые не соответствуют типу кодировки, есть вероятность, что они не будут отображаться в DiffMerge.

Генерируемая строка и ожидаемый результат, вероятно, имеют разные кодировки символов. Когда вы делаете ASCII.GetBytes, вы конвертируете все в ASCII. Итак, ваши строки конвертируются в ASCII и равны с точки зрения набора символов ASCII. Тем не менее, они могут быть неравными в других наборах символов (и при этом «выглядеть» так же).

Кроме того, попробуйте сделать string.Compare(str1, str2, StringComparison.XXXX) и сообщите нам, что происходит.

...