Пользовательский порядок сортировки - PullRequest
2 голосов
/ 07 апреля 2011

Есть ли способ в .NET / C # отсортировать List<string> в соответствии с пользовательским алфавитным порядком?

У меня есть список слов:

{ "badum", "śiram", "ðaur", "hor", "áltar", "aun" }

, которые я хочу отсортировать в следующем порядке:

{ "áltar", "aun", "badum", "śiram", "hor", "ðaur" }

Под произвольным алфавитным порядком я имею в виду, что я работаю на построенном языке с алфавитом, который выглядит следующим образом: ABZTMIGJLNKSOŚPRFUHDVEÐÞY. C # реализация RuleBasedCollator, найденная в Java, была бы идеальной! Если такой вещи не существует, несколько указателей на написание собственного алгоритма будут оценены.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 07 апреля 2011

Я бы определенно начал с создания RuleBasedCollator. Выяснить, какие правила вы хотите, является одной из самых сложных задач.

Существует проект, который обеспечивает .net-привязки через icu , который может вам подойти.

Если это не соответствует вашим требованиям, и вы решили написать свой собственный, Алгоритм сопоставления Unicode является хорошим ресурсом. Имейте в виду, что концептуальная сортировка естественного языка (хотя возможны многие оптимизации) включает отдельные этапы с возрастающей специфичностью. Первый проход будет искать так называемые первичные различия (обычно игнорируя различия регистра и определенных диакритических знаков и знаков препинания), если нет различий и количество первичных единиц в обеих строках одинаково, тогда вы можете сделать второй проход, это время с учетом диакритических различий, если таковые имеются. Затем вы обрабатываете регистр различий и, наконец, знаки препинания.

2 голосов
/ 07 апреля 2011

Вы можете передать пользовательский сортировщик методу List.Sort():

List<string> foo = new List<string>();
foo.Sort((a, b) => a.CompareTo(b));

Это позволит отсортировать список на месте в зависимости от того, какие критерии вы хотите использовать (выше, очевидно, выполняется только обычное сравнение строк).

...