Как отсортировать список с диакритическими знаками, не удаляя диакритические знаки - PullRequest
4 голосов
/ 27 марта 2011

Как отсортировать список, содержащий буквы с диакритическими знаками?

Составлены слова, использованные в этом примере.

Теперь я получаю список, который отображает это:

  • báb
  • баз
  • bez

Но я хочу получить список, который отображает это:

  • baz
  • báb
  • bez

Отображение диакритического знака в виде отдельной буквы.Есть ли способ сделать это в C #?

1 Ответ

2 голосов
/ 27 марта 2011

Если вы установите культуру текущего потока на язык, для которого вы хотите отсортировать, то это должно работать автоматически (при условии, что вам не нужен какой-то специальный настраиваемый порядок сортировки). Как это

List<string> mylist;
....
Thread.CurrentThread.CurrentCulture = new CultureInfo("pl-PL");
mylist.Sort();

Должен получить список, отсортированный в соответствии с настройками польской культуры.

Обновление : если настройки культуры не сортируют его так, как вам нужно, то другим вариантом является реализация собственного средства сравнения строк.

Обновление 2 : Пример сравнения строк:

public class DiacriticStringComparer : IComparer<string>
{
    private static readonly HashSet<char> _Specials = new HashSet<char> { 'é', 'ń', 'ó', 'ú' };

    public int Compare(string x, string y)
    {
        // handle special cases first: x == null and/or y == null,  x.Equals(y)
        ...

        var lengthToCompare = Math.Min(x.Length, y.Length);
        for (int i = 0; i < lengthToCompare; ++i)
        {
            var cx = x[i];
            var cy = y[i];

            if (cx == cy) continue;

            if (_Specials.Contains(cx) || _Specials.Contains(cy))
            {
                // handle special diacritics comparison
                ...
            }
            else
            {
                // cx must be unequal to cy -> can only be larger or smaller
                return cx < cy ? -1 : 1;
            }
        }
        // once we are here the strings are equal up to lengthToCompare characters
        // we have already dealt with the strings being equal so now one must be shorter than the other
        return x.Length < y.Length ? -1 : 1;
    }
}

Отказ от ответственности: я не проверял это, но оно должно дать вам общее представление. Также char.CompareTo() не сравнивает лексикографически, но согласно одному источнику, который я обнаружил, <и> не может гарантировать это, хотя. В худшем случае вам нужно преобразовать cx и cy в строки, а затем использовать сравнение строк по умолчанию.

...