СортировкаList/SortedDictionary странное поведение

Может кто-нибудь объяснить, почему этот код:

Dim Data As New SortedList(StringComparer.InvariantCultureIgnoreCase)
Data.Add("AB", 48)
Data.Add("AC", 48)
Data.Add("A-D", 48)
Data.Add("A-", 48)

Создает отсортированный список в следующем порядке:

A-  
AB  
AC  
A-D

Ожидаемый (логичный и действительно желаемый) порядок:

A-
A-D
AB
AC

Ответ 1

Dim Data As New SortedList(StringComparer.InvariantCultureIgnoreCase)

Я думаю, проблема связана с указанными правилами сортировки.

Изменение InvariantCultureIgnoreCase до Ordinal или OrdinalIgnoreCase решает проблему

Dim Data As New SortedList(StringComparer.OrdinalIgnoreCase)

Вот Демо

Ответ 2

Так реализуется стандартный сопоставитель строк. Чтобы настроить это, вы должны реализовать свой собственный IComparer или для лучшей совместимости переопределить класс Comparer<T> и передать его конструктору SortedList или передать StringComparer.OrdinalIgnoreCase.

Ответ 3

Вы просите, чтобы компарент действовал культурно безразличным образом. Это использует то, что чувствует команда локализации, является наиболее подходящим методом, так что потребители в разных культурах поймут сортировку.

Это не является порядковым, так что не все символы автоматически учитываются и оцениваются.

Я бы рискнул предположить, что дефисы игнорируются (концептуально конкатенирующие слова) с целью сортировки по алфавиту.

Вы можете предположить, что "Рики-Бобби" предстает перед "РиккиБобби", но команда локализации, по-видимому, не согласилась. Потребители во всех культурах, скорее всего, поймут сортировку безразличия между этими двумя записями... и, кроме того, поймут, почему оба приходят раньше "Рикки-Чарли"