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

Пусть говорят, у меня есть список строк со шведскими словами: banan, äpple, apelsin, druva.

Теперь я хочу отсортировать этот список (имейте в виду, что это очень упрощенная версия реального запроса):

var result = from f in fruits // The list mentioned above
             orderby f
             select f

Это даст мне: apelsin, äpple, banan, druva. Однако, согласно шведскому алфавиту, я должен получить: apelsin, banan, druva, äpple

Я попытался изменить System.Threading.Thread.CurrentThread.CurrentCulture на sv-SE но это, похоже, не повлияло на это вообще. Должен ли я написать свою собственную лямбда-функцию и использовать .OrderBy(...) или есть что-то еще, что я могу сделать, чтобы сохранить LINQ нетронутым?

Ответы

Ответ 1

Вы не можете сделать это с помощью выражения запроса, но вы можете сделать это с явным обозначением точки:

var result = fruits.OrderBy(f => f, StringComparer.CurrentCulture);

Это должно сделать это, предполагая, что текущая культура потока правильная. В качестве альтернативы:

CultureInfo culture = new CultureInfo("sv-SE");
var result = fruits.OrderBy(f => f, StringComparer.Create(culture, false));

Ответ 2

Я пробовал использовать ваш случай использования, и он предоставил достоверные результаты без необходимости предоставления сопоставления для конкретной культуры (как в .NET 3.5, так и в .NET 4.0):

    Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("sv-SE");
    var fruits = new[] { "banan", "äpple", "apelsin", "druva" };
    var result = (from f in fruits orderby f select f).ToList();

    // outputs: apelsin, banan, druva, äpple
    string resultsJoined = string.Join(", ", result);