Сравнение строк
От: yg  
Дата: 10.12.07 13:50
Оценка: 439 (21)
#Имя: FAQ.dotnet.string.compare
>У меня есть следующий тестовый код:
            string s1, s2;
            int res;
            s1 = "CSK."; s2 = "CSK-";
            res = CompareTo(s1, s2);
            Console.WriteLine(res);

            s1 = "CSK.S"; s2 = "CSK-V";
            res = CompareTo(s1, s2);
            Console.WriteLine(res);

>Результат
1
-1

>Я ожидал не такое поведение. Получается, длина строки влияет на результат сравнения или вес последних символов больше веса первых символов?
>Вопрос 1: Как мне добиться, чтобы на выходе было 1, 1 ну или -1, -1?
>Вопрос 2: Почему я получаю такой результат?

Фишка в том, что по умолчанию при сравнении строк в .NET символы апострофа и дефиса имеют очень малые веса. Фактически они учитываются только если строки совпадают за исключением этих символов.

Вот выдержка из MSDN:

The .NET Framework uses three distinct ways of sorting: word sort, string sort, and ordinal sort. Word sort performs a culture-sensitive comparison of strings. Certain nonalphanumeric characters might have special weights assigned to them; for example, the hyphen ("-") might have a very small weight assigned to it so that "coop" and "co-op" appear next to each other in a sorted list. String sort is similar to word sort, except that there are no special cases; therefore, all nonalphanumeric symbols come before all alphanumeric characters. Ordinal sort compares strings based on the Unicode values of each element of the string.


Изменить способ сортировки можно при помощи перечисления CompareOptions.
Чтобы включить "ordinal sort", использовать CompareOptions.Ordinal.
Чтобы включить "string sort", использовать CompareOptions.StringSort.

Меня слегка удивляет, что по умолчанию включено "word sort", а не "string sort"... Например, как уже тут говорили, SQL Server по умолчанию сортирует обычным способом. А поскольку SQL Server и .NET — это стандартная связка, то получаем красиво и со вкусом разложенные грабли.

Люди! Будьте осторожны!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.