Сравнение строк в .Net: "+" против "-" - PullRequest
14 голосов
/ 11 февраля 2010

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

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

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

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

Ответы [ 5 ]

10 голосов
/ 11 февраля 2010

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

string.Compare("+", "-", StringComparison.Ordinal); // == -2
string.Compare("+1", "-1", StringComparison.Ordinal); // == -2
7 голосов
/ 11 февраля 2010

Не обязательно согласованный посимвольный порядок для какой-либо конкретной локали.

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

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

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

3 голосов
/ 11 февраля 2010
        string.Compare("+", "-");
        string.Compare("+", "-", StringComparison.CurrentCulture);
        string.Compare("+", "-", StringComparison.InvariantCulture);
        string.Compare("+", "-", StringComparison.InvariantCultureIgnoreCase);

        // All Pass

оба значения равны, потому что учитывается паховая оболочка

FIX:

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

ссылка: Использовать порядковый номер сравнения строк

string.Compare ("+", "-", StringComparison.Ordinal); // ошибка

2 голосов
/ 11 февраля 2010

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

больше, чем вы захотите узнать о множестве различных видов штрихов.
0 голосов
/ 11 февраля 2010

использование CompareOrdinal . например,

String.CompareOrdinal("+1","-1");
-2
String.CompareOrdinal("+","-");
-2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...