Сортировка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
Вы просите, чтобы компарент действовал культурно безразличным образом. Это использует то, что чувствует команда локализации, является наиболее подходящим методом, так что потребители в разных культурах поймут сортировку.
Это не является порядковым, так что не все символы автоматически учитываются и оцениваются.
Я бы рискнул предположить, что дефисы игнорируются (концептуально конкатенирующие слова) с целью сортировки по алфавиту.
Вы можете предположить, что "Рики-Бобби" предстает перед "РиккиБобби", но команда локализации, по-видимому, не согласилась. Потребители во всех культурах, скорее всего, поймут сортировку безразличия между этими двумя записями... и, кроме того, поймут, почему оба приходят раньше "Рикки-Чарли"