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

问题描述 投票:2回答:2

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

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

有人知道我如何使用自定义比较器或使用现有的文化比较器吗?

c# sorting cultureinfo
2个回答
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. Af

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.