Reputation: 50197
Let's say I've got a list of strings with Swedish words: banan
, äpple
, apelsin
, druva
.
Now I want to get this list sorted (keep in mind that this is a very simplified version of the real query):
var result = from f in fruits // The list mentioned above
orderby f
select f
This will give me: apelsin
, äpple
, banan
, druva
. However, according to the Swedish alphabet, I should get: apelsin
, banan
, druva
, äpple
I tried changing System.Threading.Thread.CurrentThread.CurrentCulture
to sv-SE
but that didn't really seem to affect it at all. Do I have to write my own lambda function and use .OrderBy(...)
or is there something else I can do to keep the LINQ intact?
Upvotes: 27
Views: 15157
Reputation: 3957
I've tried your use case and it did provide valid results without a need to provide culture-specific comparer (both in .NET 3.5 and .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);
Upvotes: 3
Reputation: 1503954
You can't do this with a query expression, but you can do it with explicit dot notation:
var result = fruits.OrderBy(f => f, StringComparer.CurrentCulture);
That should do it, assuming the thread's current culture is correct. Alternatively:
CultureInfo culture = new CultureInfo("sv-SE");
var result = fruits.OrderBy(f => f, StringComparer.Create(culture, false));
Upvotes: 52