如何按德语电话簿字母对字符串排序

时间:2019-11-04 16:06:32

标签: c# sorting cultureinfo

我正在尝试使用德语字母的电话簿顺序对字符串列表进行排序。在德语字母排序中,特殊字符或变音符号由以下内容表示:

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

因此,升序排序应以如下形式结束:

  1. 广告
  2. Ä
  3. Af

我正在C#Universe中工作,并且一直在使用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 个答案:

答案 0 :(得分:3)

德语电话簿排序是一种替代排序,可以使用“ de-DE_phoneb”作为名称而不是“ de”来激活。

答案 1 :(得分:2)

您可以实现自己的比较器类,以在比较两个字符串之前替换变音符:

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);
    }
}

用于从here进行替换的代码。

然后,您可以简单地创建一个CustomStringComparer的新实例,并将其作为参数添加到您的.OrderBy调用中,如下所示:

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

这将产生所需的输出:

  1. 广告
  2. Ä
  3. Af