Как получить 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);