Вы можете реализовать свой собственный класс сравнения, который заменяет умляуты перед сравнением двух строк:
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());
Это приведет к желаемому результату:
- Ad
- Ä
- Af