Сравнение строк в .Net: "+" против "-"

Я всегда предполагал, что .Net сравнивает строки лексикографически, согласно текущей культуре. Но есть что-то странное, когда одна из строк заканчивается на '-':

"+".CompareTo("-")
Returns: 1

"+1".CompareTo("-1")
Returns: -1

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

Ответ 1

Не обязательно последовательное упорядочивание по каждому символу для любого конкретного языка.

Из Документация MSDN:

Например, культура может указать, что определенные комбинации символов обрабатываться как один символ, или символы верхнего и нижнего регистра сравниваться определенным образом или что порядок сортировки символа зависит от символов, которые предшествуют или следуют за ним.

Единственный способ обеспечить согласованное пошаговое упорядочение - использовать порядковое сравнение, как показано в Антон ответить.

Ответ 2

Попробуйте изменить это на

string.Compare("+", "-", StringComparison.Ordinal); // == -2
string.Compare("+1", "-1", StringComparison.Ordinal); // == -2

Ответ 3

        string.Compare("+", "-");
        string.Compare("+", "-", StringComparison.CurrentCulture);
        string.Compare("+", "-", StringComparison.InvariantCulture);
        string.Compare("+", "-", StringComparison.InvariantCultureIgnoreCase);

        // All Pass

два значения равны, потому что учетный корпус учитывается

FIX:

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

ссылка: Использовать порядковый столбец

string.Compare( "+", "-", StringComparison.Ordinal);//fail

Ответ 4

Вероятно, вы захотите использовать знак "минус", кодовый номер Unicode\u2212. Знак минус, который вы используете в программировании (\ u002d), представляет собой "дефис-минус", его порядок сортировки чувствителен к контексту, потому что он также часто используется как дефис. Там больше, чем вы захотите узнать о различных типах тире в этой статье.

Ответ 5

используйте CompareOrdinal. например,

String.CompareOrdinal("+1","-1");
-2
String.CompareOrdinal("+","-");
-2