Сравнение строк и алфавитный заказ отдельных персонажей
У меня есть вопрос, связанный с сопоставлением строк и сравнением символов.
Символы >
и 0
(ноль) имеют следующие десятичные значения 62
и 48
соответственно.
Когда я сравниваю два символа в следующем коде, я получаю значение True
(что правильно)
Console.WriteLine('>' > '0');
Когда я сравниваю две односимвольные строки в следующем коде, я получаю значение -1
, которое указывает, что " > " меньше "0" (культура по умолчанию - английский)
Console.WriteLine(string.Compare(">", "0"));
В то время как сравнение значений кода "3" и "1" (51
и 49
) в следующем коде возвращает 1
(как ожидалось)
Console.WriteLine(string.Compare("3", "1"));
Кроме того, в документации string.Compare(string str1, string str2)
говорится:
Сравнение использует текущую культуру для получения специфических для культуры информации, такой как правила обсадной колонны и алфавитный порядок отдельные символы
Вы могли бы объяснить (или предоставить ссылку на какую-либо документацию), как реализуется сравнение строк, например. как вычисляется алфавитный порядок отдельных символов и т.д.
Ответы
Ответ 1
Когда вы сравниваете символы '>'
и '0'
, вы сравниваете их порядковые значения.
Чтобы получить такое же поведение из сравнения строк, поставьте тип сравнения порядковых строк:
Console.WriteLine(string.Compare(">", "0", StringComparison.Ordinal));
Console.WriteLine(string.Compare(">", "0", StringComparison.InvariantCulture));
Console.WriteLine(string.Compare(">", "0", StringComparison.CurrentCulture));
Текущая культура используется по умолчанию, которая имеет порядок сортировки, предназначенный для сортировки строк "в алфавитном порядке" в строго лексическом порядке, для некоторого определения в алфавитном порядке.
Ответ 2
Порядок сортировки строк зависит от используемой вами культуры.
StringComparer.CurrentCulture сортирует следующие 1-символьные строки, как показано ниже на моей машине:
' - ! " # $ % & ( ) * , . / : ; ? @ [
\ ] ^ _ ` { | } ~ + < = > 0 1 2 3 4 5 6
7 8 9 a A b B c C d D e E f F g G h H i
I j J k K l L m M n N o O p P q Q r R s
S t T u U v V w W x X y Y z Z
StringComparer.Ordinal сортирует те же строки следующим образом:
! " # $ % & ' ( ) * + , - . / 0 1 2 3
4 5 6 7 8 9 : ; < = > ? @ A B C D E F G
H I J K L M N O P Q R S T U V W X Y Z [
\ ] ^ _ ` a b c d e f g h i j k l m n o
p q r s t u v w x y z { | } ~
Ответ 3
Похоже, что вы хотите сравнить, чтобы не использовать специфические для культуры правила. Вы пробовали StringComparison.Ordinal:
Console.WriteLine( string.Compare( ">", "0", StringComparison.Ordinal ) ); // returns a positive number
Ответ 4
он возвращает -1
, потому что он сравнивает str2
с str1
, а не наоборот. Например, "48 равно 62". Нет, он меньше 62, поэтому он возвращает -1. Это семантически немного запутывает, когда вы читаете порядок параметров