Как отсортировать строки по алфавиту немецкой телефонной книги - PullRequest
2 голосов
/ 04 ноября 2019

Я пытаюсь отсортировать список строк, используя порядок в телефонной книге немецкого алфавита. В сортировке по немецкому алфавиту специальные символы или умлауты представлены следующим образом:

  1. Ä -> ae
  2. Ö -> oe
  3. Ü -> ue

Следовательно, порядок сортировки по возрастанию должен выглядеть примерно так:

  1. Ad
  2. Ä
  3. Af

Я работаю во вселенной C # и использую CultureInfo для создания нового сравнения строк для сортировки. Используя это, я получаю следующий заказ:

  1. Ä
  2. Объявление
  3. Af

    List<string> l = new List<string>();
    l.Add("Ad");
    l.Add("Ä");
    l.Add("Af");
    
    var comparer = StringComparer.Create(CultureInfo.CreateSpecificCulture("de"), true);
    var x = l.OrderBy(y => y, comparer);
    
    foreach(var outp in x) {
        Console.WriteLine(outp);
    }
    

Кто-нибудь знает, как я могу сделать это с помощью пользовательского компаратора или с помощью существующего компаратора культуры?

Ответы [ 2 ]

3 голосов
/ 05 ноября 2019

Немецкая сортировка телефонной книги является альтернативной сортировкой и может быть активирована с использованием «de-DE_phoneb» в качестве имени вместо «de».

2 голосов
/ 04 ноября 2019

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

class CustomStringComparer : IComparer<string>
{

    private string ReplaceUmlauts(string germanText)
    {
        var map = new Dictionary<char, string>() {
          { 'ä', "ae" },
          { 'ö', "oe" },
          { 'ü', "ue" },
          { 'Ä', "Ae" },
          { 'Ö', "Oe" },
          { 'Ü', "Ue" },
          { 'ß', "ss" }
        };

        var res = germanText.Aggregate(
                      new StringBuilder(),
                      (sb, c) => map.TryGetValue(c, out var r) ? sb.Append(r) : sb.Append(c)
                      ).ToString();

        return res;
    }

    public int Compare(string x, string y)
    {
        var xWithoutUmlauts = ReplaceUmlauts(x);
        var yWithoutUmlauts = ReplaceUmlauts(y);

        return StringComparer.CurrentCulture.Compare(xWithoutUmlauts, yWithoutUmlauts);
    }
}

Код для замены из здесь .

Тогда вы можетепросто создайте новый экземпляр CustomStringComparer и добавьте его в качестве параметра в свой вызов .OrderBy следующим образом:

var x = l.OrderBy(z => z, new CustomStringComparer());

Это приведет к желаемому результату:

  1. Ad
  2. Ä
  3. Af
...