У меня проблема с сортировкой шведских строк.
У меня проблемы со следующими персонажами: v, w, å, ä, ö.
new[] { "ö", "ä", "å", "wa", "va", "wb", "vb", "a" }
.OrderBy(x => x, new CultureInfo("sv-SE").CompareInfo.GetStringComparer(CompareOptions.None))
Ожидаемое: a, va, vb, wa, wb, å, ä, ö
Фактические: а, ва, ва, вб, вб, б, б, б
Есть ли возможность сделать так, чтобы строки сортировались, как и ожидалось?
Всего 2 ответа
Вы ожидаете, что это сработает:
CultureInfo culture = new CultureInfo("sv-SE");
var result = new[] { "ö", "ä", "å", "wa", "va", "wb", "vb", "a" }
.OrderBy(f => f, StringComparer.Create(culture, true));
К сожалению, Compare
возвращает -1
используя следующий код:
StringComparer stringComparer = StringComparer.Create(new CultureInfo("sv-SE"), false);
int compare = stringComparer.Compare("w", "va");
Вы можете обойти это, внедрив свой собственный IComparer<string>
. Что-то вроде этого:
public class SeComparer : IComparer<string>
{
private static readonly StringComparer s_stringComparer = StringComparer.Create(new CultureInfo("sv-SE"), false);
public int Compare(string x, string y)
{
bool xEmpty = string.IsNullOrEmpty(x);
bool yEmpty = string.IsNullOrEmpty(y);
if (xEmpty && yEmpty)
return 0;
else if (xEmpty)
return -1;
else if (yEmpty)
return 1;
if (x[0] == 'w' && y[0] == 'v')
return 1;
else if (x[0] == 'v' && y[0] == 'w')
return 0;
return s_stringComparer.Compare(x, y);
}
}
Использование:
var result = new[] { "ö", "ä", "å", "w", "v", "wb", "va", "a" }
.OrderBy(f => f, new SeComparer());
Или вы можете попробовать другую культуру, например, se-SE
как вы упомянули в комментарии.
В качестве обходного пути я переключился на культурный se-SE (Sami) только для правильной сортировки буквенных строк, пока жду обновления правил сортировки .NET.
Обновить:
Вот проблема GitHub: https://github.com/dotnet/corefx/issues/37753