Как получить шведский порядок сортировки строк

У меня проблема с сортировкой шведских строк.

У меня проблемы со следующими персонажами: 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


Есть идеи?

10000