Сравнение строк 1 длины дает результат, отличный от сравнения символов ... почему? - PullRequest
0 голосов
/ 16 мая 2018

Я новичок в C # и обнаружил нечто неожиданное в сравнении строк, которое я не совсем понимаю.

Может кто-нибудь объяснить, почему сравнение между символами дало противоположный результат, как сравнение строк длиной в один символ в следующем коде?

Я ожидал, что "9" < "=" будет true (так как код Unicode '9' (57) меньше, чем код Unicode '=' (61)), но это ложь ... Что такое логика сравнения строк и чем она отличается от сравнения символов?

Код:

bool resChComp = '9' < '=';
bool resStrComp = String.Compare("9", "=") < 0;

Console.WriteLine($"\n'9' < '=' : {resChComp}, \"9\" < \"=\" : { resStrComp }");

Выход:

'9' < '=' : True, "9" < "=" : False

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Это потому, что String.Compare по умолчанию использует порядки сортировки слов, а не числовые значения для символов. Просто так получилось, что для используемой культуры, 9 предшествует = в порядке сортировки.

Если вы укажете обычные (двоичные) правила сортировки, упомянутые здесь , все будет работать так, как вы ожидаете.

bool resStrComp = String.Compare("9", "=", StringComparison.Ordinal) < 0;
0 голосов
/ 16 мая 2018

Сравнение строк по умолчанию выполняет «сортировку слов». Из документации ,

.NET Framework использует три различных способа сортировки: сортировка слов, сортировка строк и порядковая сортировка. Сортировка слов выполняет сравнение строк с учетом культурных особенностей. Некоторым не буквенно-цифровым символам могут быть назначены специальные веса. Например, дефису («-») может быть присвоен очень маленький вес, так что «кооператив» и «кооператив» появляются рядом друг с другом в отсортированном списке. Сортировка строк похожа на сортировку слов, за исключением того, что особых случаев нет. Поэтому все не буквенно-цифровые символы располагаются перед всеми буквенно-цифровыми символами. Порядковая сортировка сравнивает строки на основе значений Unicode каждого элемента строки.

Сравнение, которое вы ожидаете, является порядковым сравнением, которое вы можете получить, используя StringComparison.Ordinal в перегрузке String.Compare, например:

bool resStrComp = String.Compare("9", "=", StringComparison.Ordinal) < 0;

При этом строки будут сравниваться с использованием их значений Юникода, аналогично сравнению символа с другим символом.

0 голосов
/ 16 мая 2018

В случае сравнения символов символы будут преобразованы в int, соответствующее значению ASCII.9 имеет значение ASCII 57, а = имеет значение 61. Это означает, что сравнение строк и сравнение символов не сравнивают одно и то же (поэтому они могут иметь разные результаты).

...