Порядок сортировки VB.NET с использованием CompareTo - неверные результаты?

У меня есть длинный список строковых значений, которые я пытаюсь отсортировать в сетке. Изначально для всей сетки использовался алгоритм сортировки по умолчанию. Однако в итоге мне пришлось переписать сортировку для сетки, потому что несколько столбцов требовали специальной сортировки, а сетка не допускала пользовательской сортировки для определенных столбцов. Рассматриваемый здесь столбец не требовал специальной сортировки, поэтому я просто использовал CompareTo:

Public Function Compare(ByVal p1 as MyObj, ByVal p2 as MyObj) As Integer
    Return p1.Description.CompareTo(p2.Description)
End Function

Сравнивая метод сортировки по сетке по умолчанию и тот, который я сейчас использую с CompareTo, я получаю точно такие же результаты. Однако результаты сортировки прямого запроса к базе данных отличаются (где результаты сортировки базы данных верны в соответствии с тем, что я думаю, что они должны быть).

Вот три примера того, что я считаю неправильными результатами сортировки:

Пример 1

Сортировать результат:

  1. ТЕСТ- A/A МОЙ ТЕСТ
  2. ТЕСТ1000 ТЕСТ
  3. ТЕСТ1000 ТЕСТ
  4. ТЕСТ ТЕСТ
  5. ТЕСТ-B/A МОЙ ТЕСТ

Ожидаемый результат:

  1. ТЕСТ- A/A МОЙ ТЕСТ
  2. ТЕСТ-B/A МОЙ ТЕСТ
  3. ТЕСТ1000 ТЕСТ
  4. ТЕСТ1000 ТЕСТ
  5. ТЕСТ ТЕСТ

Пример 2

Сортировать результат:

  1. ТЕСТ- ТЕСТ
  2. ПРОВЕРЬ МЕНЯ
  3. ТЕСТ-#1 А
  4. ТЕСТ-#1 Б

Ожидаемый результат:

  1. ПРОВЕРЬ МЕНЯ
  2. ТЕСТ- ТЕСТ
  3. ТЕСТ-#1 А
  4. ТЕСТ-#1 Б

Пример 3

Сортировать результат:

  1. ЛУИЗА ТЕСТ 1
  2. ЛУИЗА ТЕСТ 2
  3. ЛУИ - ТЕСТ 1

Ожидаемый результат:

  1. ЛУИ - ТЕСТ 1
  2. ЛУИЗА ТЕСТ 1
  3. ЛУИЗА ТЕСТ 2

Кто-нибудь сталкивался с этим раньше или есть какие-либо идеи, что здесь может происходить?


person lmg    schedule 14.08.2012    source источник


Ответы (1)


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

Рассмотрите возможность использования перегрузки Compare, которая позволяет указать StringComparison как порядковый номер

person Jim O'Neil    schedule 14.08.2012
comment
Спасибо Джим! Это именно то, что мне было нужно. В итоге я сделал следующее: String.CompareOrdinal(p1.Description, p2.Description) - person lmg; 15.08.2012