2010-11-06 3 views

ответ

4

Другим способ показать это поведение является:

Console.WriteLine("a".CompareTo("b")); // -1 
Console.WriteLine("b".CompareTo("a")); // 1 
Console.WriteLine('a'.CompareTo('b')); // -1 
Console.WriteLine('b'.CompareTo('a')); // 1 

Console.WriteLine("~".CompareTo("a")); // -1 
Console.WriteLine("a".CompareTo("~")); // 1 
Console.WriteLine('~'.CompareTo('a')); // 29 
Console.WriteLine('a'.CompareTo('~')); // -29 

разница может быть тонким, но это documented. Сравнения в Char.CompareTo(Char) является

на основе кодированных значений этого экземпляра и значения, не их лексикографические характеристик.

В то же время, для documentationString.CompareTo(String)

выполняет слово (чувствительный к регистру и культуры чувствительный) сравнения, используя текущую культуру.

I.e. первая основана на сравнении по порядку, вторая по правилам по умолчанию в текущей культуре (порядок, который вы можете увидеть в словаре).

8

myChar.CompareTo(otherChar) сравнивает два символа только по их значениям в Юникоде.

myString.CompareTo(otherString) использует сортировщик текущей культуры, который может быть реализован более лексическим образом.

2

Я думаю, что myString.CompareTo(otherString) возвращает то же значение, что и CultureInfo.CurrentCulture.CompareInfo.Compare(myString,otherString,CompareOptions.None), т. Е. Сопоставляет культура.

В большинстве культур, не буквенные символы сортируются до письма, поэтому '~' предшествует 'a'.

«char.CompareTo (otherChar)», с другой стороны, просто сравнивает значения unicode (т. Е. 97 для «a» против 126 для «~») и, следовательно, возвращает другой результат.

1

Для сравнения строк так же, как символы (по порядку только символы коды) вы должны использовать порядковое сравнение:

Console.WriteLine(String.Compare("~", "a", StringComparison.Ordinal) > 0); 

Выход:

True 
Смежные вопросы