Заказ по шведским буквам - PullRequest
       3

Заказ по шведским буквам

11 голосов
/ 29 августа 2011

У меня есть список моего пользовательского класса Customer, и я хочу отсортировать их в алфавитном порядке по названию. Итак, я написал

myList = myList.OrderByDescending(x => x.Title).ToList<Customer>();

Теперь проблема в том, что этот метод не поддерживает шведский способ сортировки букв å, ä, ö. Они должны появляться в конце после буквы z, но не появляются.

Итак, я сделал обходной метод, который заменяет шведские буквы перед упорядочением, а затем изменяет их обратно после слов. Это выглядит так, но довольно медленно. Может кто-нибудь придумать лучший способ?

private List<Customer> OrderBySwedish(List<Customer> myList)
    {
        foreach (var customer in myList)
        {
            customer.Title = customer.Title.Replace("å", "zzz1").Replace("ä", "zzz2").Replace("ö", "zzz3").Replace("Å", "Zzz1").Replace("Ä", "Zzz2").Replace("Ö", "Zzz3");
        }

        myList= myList.OrderBy(x => x.Title).ToList<Customer>();

        foreach (var customer in myList)
        {
            customer.Title = customer.Title.Replace("zzz1", "å").Replace("zzz2", "ä").Replace("zzz3", "ö").Replace("Zzz1", "Å").Replace("Zzz2", "Ä").Replace("Zzz3", "Ö");
        }
        return myList;
    }

Ответы [ 4 ]

21 голосов
/ 29 августа 2011

Вы можете использовать специфические для культуры StringComparer, см. здесь .

CultureInfo culture = new CultureInfo("sv-SE");
var result = myList.OrderByDescending(x => 
               x.Title, StringComparer.Create(culture, false));
4 голосов
/ 29 августа 2011

Установите для свойства Thread.CurrentCulture правильную культуру.

1 голос
/ 21 октября 2016

В моем случае: _Мой список сортировки имеет значение, закодировано.Это делает мой заказ неверным.Добавь расшифрованное решение моих проблем!

0 голосов
/ 29 августа 2011

Обходной путь, который я нашел для несколько схожей проблемы, заключался в том, чтобы иметь дополнительное поле, содержащее преобразованную версию данных.
В моем случае у нас было person.Name и person.SearchName, где SearchName было Name преобразовано без диакритических знаков.

Но это был только лучший подход (AFAIK), потому что мы хотели быстрый поиск / фильтрацию БД, а затем создание только соответствующих результатов.
Если у вас уже есть объекты в памяти, я бы посоветовал использовать один из других подходов; и не этот.

...