Этот код:странная вещь о сравнении строк
Console.WriteLine("~".CompareTo("a") > 0);
Console.WriteLine('~'.CompareTo('a') > 0);
дает мне:
False
True
WTF?
Этот код:странная вещь о сравнении строк
Console.WriteLine("~".CompareTo("a") > 0);
Console.WriteLine('~'.CompareTo('a') > 0);
дает мне:
False
True
WTF?
Другим способ показать это поведение является:
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. первая основана на сравнении по порядку, вторая по правилам по умолчанию в текущей культуре (порядок, который вы можете увидеть в словаре).
myChar.CompareTo(otherChar)
сравнивает два символа только по их значениям в Юникоде.
myString.CompareTo(otherString)
использует сортировщик текущей культуры, который может быть реализован более лексическим образом.
Я думаю, что myString.CompareTo(otherString)
возвращает то же значение, что и CultureInfo.CurrentCulture.CompareInfo.Compare(myString,otherString,CompareOptions.None)
, т. Е. Сопоставляет культура.
В большинстве культур, не буквенные символы сортируются до письма, поэтому '~'
предшествует 'a'
.
«char.CompareTo (otherChar)», с другой стороны, просто сравнивает значения unicode (т. Е. 97 для «a» против 126 для «~») и, следовательно, возвращает другой результат.
Для сравнения строк так же, как символы (по порядку только символы коды) вы должны использовать порядковое сравнение:
Console.WriteLine(String.Compare("~", "a", StringComparison.Ordinal) > 0);
Выход:
True