Я пытаюсь сгруппировать список строк по их начальной букве. Допустим, это список:
azaroth
älgkebab
orgel
ölkorv
Когда список отсортирован в соответствии с sv-SE
, это порядок сортировки:
azaroth
orgel
älgkebab
ölkorv
Что означает, что группировка по начальной букве будет
A
azaroth
O
orgel
Ä
älgkebab
Ö
ölkorv
Это имеет смысл, и это также, как вы найдете его в телефонной книге в стране, где используется sv-SE
.
Когда список отсортирован в соответствии с en-US
, это порядок сортировки:
älgkebab
azaroth
ölkorv
orgel
Теперь самое интересное. Это означает, что группировка по начальной букве будет
AÄ
älgkebab
azaroth
OÖ
ölkorv
orgel
Поскольку во всех практических целях «a» и «ä» рассматривались как одна и та же буква во время сортировки, так же как «o» и «ö», что означает, что они для этой цели одинаковые начальные . Это AFAIK, как вы найдете его в телефонной книге в стране, которая использует en-US
.
Мой вопрос: как я могу достичь этой группировки программно, когда она варьируется в зависимости от культуры? Или, другими словами, как узнать, какие буквы рассматриваются как «одинаковые» при сортировке список в конкретной культуре?
Я не нашел способа сделать StringComparer
возврат 0
для "a" против "ä", например.
У меня есть решение, которое, кажется, работает, которое делает это:
if (
cultureInfo.CompareInfo.GetSortKey("a").KeyData[1] ==
cultureInfo.CompareInfo.GetSortKey("ä").KeyData[1]
) // same initial (this will return false for sv-SE and true for en-US)
Проблема в том, что я понятия не имею, работает ли он для любой культуры или даже каков второй фрагмент данных в массиве KeyData
SortKey
на самом деле. Страница на MSDN довольно расплывчата и, вероятно, целенаправленно. Так что я бы предпочел, чтобы было более надежное решение.