我正在尝试使用德语字母的电话簿顺序对字符串列表进行排序。在德语字母排序中,特殊字符或变音符号由以下内容表示:
因此,升序排序应以如下形式结束:
我正在C#Universe中工作,并且一直在使用CultureInfo创建用于排序的新字符串比较器。使用此命令,我得到以下命令:
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);
}
有人知道我如何使用自定义比较器或使用现有的文化比较器吗?
答案 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());
这将产生所需的输出: