Как получить LINQ на заказ в соответствии с культурой? - PullRequest
19 голосов
/ 04 декабря 2009

Допустим, у меня есть список строк со шведскими словами: 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 нетронутым?

Ответы [ 2 ]

36 голосов
/ 04 декабря 2009

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

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 голосов
/ 19 сентября 2012

Я испробовал ваш вариант использования, и он дал действительные результаты без необходимости предоставления специфичного для культуры компаратора (как в .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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...