Сравнение строк и алфавитный заказ отдельных персонажей

У меня есть вопрос, связанный с сопоставлением строк и сравнением символов.

Символы > и 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. Это семантически немного запутывает, когда вы читаете порядок параметров