Частичное сравнение строк

Возможный дубликат:
Почему string.Compare не справляется с акцентированными символами непоследовательно?

У меня есть следующий код

var s1 = "ABzzzzz2";
var s2 = "äbzzzzz1";

var cmp = StringComparison.InvariantCultureIgnoreCase;

Console.WriteLine(string.Compare(s1, 0, s2, 0, 7, cmp)); //prints -1
Console.WriteLine(string.Compare(s1, 0, s2, 0, 8, cmp)); //prints 1

Как может быть, что часть первой строки меньше, чем часть второй, а вся первая строка больше, чем вторая?

Я тестировал его на x64,.net 2.0, 3.5, 4.0

Ответ 1

Моя теория заключается в том, что алгоритм сначала нормализует строки, а затем выполняет сравнение. В соответствии с этим "äbzzzzz1" нормализуется как "abzzzzz1". Первое сравнение в нормализованной форме приводит к равенству результатов, но возврат 0 будет иметь место, поскольку фактические строки не равны. Таким образом, он возвращается к порядковому сравнению и результатам -1.

Во втором случае, после нормализации, ясно, что "abzzzzz2" больше, чем "abzzzzz1", поэтому результат равен 1.

Этот подход также объясняет случаи, упомянутые в этом вопросе Для уточнения деталей проверьте страницу MSDN