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

How to sort strings by German phonebook alphabet

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

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

因此,升序排序最终应该是这样的:

  1. 广告
  2. Ä
  3. Af

我在 C# 领域工作,一直在使用 CultureInfo 为排序创建一个新的字符串比较器。使用这个,我得到以下顺序:

  1. Ä
  2. 广告
  3. A​​f

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

有谁知道我如何使用自定义比较器或使用现有的文化比较器来做到这一点?

您可以实现自己的比较器 class,它会在比较两个字符串之前替换元音符号:

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

德语电话簿排序是另一种排序方式,可以通过使用 "de-DE_phoneb" 作为名称来激活,而不是使用 "de"。