Почему в .Net заглавная буква больше строчной?

В Java:

"A".compareTo("a"); return -32 //"A" is less than "a".

В .Net используйте String.CompareTo:

"A".CompareTo("a"); return 1 //"A" is greater than "a".

В .Net используйте Char.CompareTo:

'A'.CompareTo('a'); return -32 //"A" is less than "a".

Я знаю, что Java сравнивает строковые символы, используя свою позицию в таблице Unicode, но .Net - нет. Как определить, какая заглавная буква больше маленькой в ​​.Net?

String.CompareTo Method (String)


person smartleos    schedule 28.06.2013    source источник
comment
Я не получил ваш вопрос во второй строке, вы сравниваете A с a, и он дает u 1, это означает, что A больше, чем a, что вы имеете в виду под своим вопросом?   -  person Sora    schedule 28.06.2013
comment
Может быть, это из-за локали. (Хотя я не могу говорить на C # ...)   -  person johnchen902    schedule 28.06.2013
comment
Внутри я использую вызов функции Windows API InternalCompareString, но не смог найти по нему документацию.   -  person Tigran    schedule 28.06.2013
comment
Мой вопрос в том, почему .Net определяет, какой A больше, чем a, а не возвращаемое значение 1. В .Net String.CompareTo возвращает 1 (больше нуля) означает, что этот экземпляр больше, чем strB. Если я использую Char.CompareTo: 'A'.CompareTo (' a '); возвращаемое значение - 32, это хорошо, но String.CompareTo возвращает 1, поэтому я хочу знать, почему и как.   -  person smartleos    schedule 28.06.2013
comment
Как я говорю ниже, это, вероятно, зависит от вашей культуры. Однако не знаю, что под этим подразумевает .NET ...   -  person fge    schedule 28.06.2013


Ответы (3)


В документе, который я смог найти, говорится, что :

Этот метод выполняет сравнение слов (с учетом регистра и языка и региональных параметров) с использованием текущего языка и региональных параметров.

Итак, это не совсем то же самое, что Java .compareTo(), который по умолчанию выполняет лексикографическое сравнение, используя, как вы говорите, кодовые точки Unicode.

Следовательно, в .NET это зависит от вашей текущей «культуры» (я полагаю, что в Java это называется «локалью»).

Похоже, что если вы хотите выполнить сравнение строк "а-ля Java" в .NET, вы должны использовать _ 2_.

Напротив, если вы хотите выполнить сравнение строк в Java, зависящее от локали, вам необходимо использовать _ 3_.

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

person fge    schedule 28.06.2013
comment
Спасибо. Я знаю String .CompareOrdinal (). В этом вопросе я хочу знать, как определить, какая заглавная буква больше маленькой буквы в .Net? Поскольку я пробую использовать код: String.Compare("A", "a", false, CultureInfo.GetCultureInfo("en-US")), возвращаемое значение - 1. Я не понимаю ... - person smartleos; 28.06.2013
comment
Эмвелл, это, вероятно, зависит от культуры. Попробуйте, например, с французским. Я понятия не имею, как культура влияет на сравнения - и меня очень удивляет, что .NET ведет себя таким образом по умолчанию, что кажется нелогичным. - person fge; 28.06.2013
comment
Посмотри на мою правку. Я думаю, .NET имеет то же самое, что и Collator. - person fge; 28.06.2013

Из Java Строка

Возвращает: значение 0, если строка аргумента равна этой строке; значение меньше 0, если эта строка лексикографически меньше, чем строковый аргумент; и значение больше 0, если эта строка лексикографически больше, чем строковый аргумент.

Из .Net String.CompareTo

Этот метод выполняет сравнение слов (с учетом регистра и языка и региональных параметров) с использованием текущего языка и региональных параметров. Для получения дополнительной информации о сортировке по слову, строке и порядковому номеру см. System .Globalization.CompareOptions.

В этом сообщении объясняется разница между типами сравнения

И документ объясняет разницу между всеми типами сравнения;

ЕСЛИ вы посмотрите на эти два, CurrentCulture и Ordinal

 StringComparison.Ordinal: 
 LATIN SMALL LETTER I (U+0069) is less than LATIN SMALL LETTER DOTLESS I (U+0131) 
 LATIN SMALL LETTER I (U+0069) is greater than LATIN CAPITAL LETTER I (U+0049) 
 LATIN SMALL LETTER DOTLESS I (U+0131) is greater than LATIN CAPITAL LETTER I (U

 StringComparison.CurrentCulture: 
 LATIN SMALL LETTER I (U+0069) is less than LATIN SMALL LETTER DOTLESS I (U+0131) 
 LATIN SMALL LETTER I (U+0069) is less than LATIN CAPITAL LETTER I (U+0049) 
 LATIN SMALL LETTER DOTLESS I (U+0131) is greater than LATIN CAPITAL LETTER I (U+0049) 

Ordinal - единственный, где "i" > "I" и, следовательно, Java как

person Java Devil    schedule 28.06.2013

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

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

Вы можете использовать функцию std :: sort с определяемой пользователем функцией предиката, которая ставит все нижний регистр перед верхним регистром.

person Manish Doshi    schedule 28.06.2013