如何根据文化获得LINQ订购?
说我有一个带有瑞典语单词的字符串列表: apelsin
, druva
, apelsin
, druva
现在我想要列出这个列表(请记住,这是真实查询的一个非常简化的版本):
var result = from f in fruits // The list mentioned above orderby f select f
这会给我: apelsin
, druva
, druva
, druva
。 然而,根据瑞典字母表,我应该得到: apelsin
, druva
, apelsin
, druva
我尝试将System.Threading.Thread.CurrentThread.CurrentCulture
更改为sv-SE
但这根本不会影响它。 我是否必须编写自己的lambda函数并使用.OrderBy(...)
或者我还能做些什么来保持LINQ完好无损?
您无法使用查询表达式执行此操作,但可以使用显式点表示法执行此操作:
var result = fruits.OrderBy(f => f, StringComparer.CurrentCulture);
应该这样做,假设线程的当前文化是正确的。 或者:
CultureInfo culture = new CultureInfo("sv-SE"); var result = fruits.OrderBy(f => f, StringComparer.Create(culture, false));
我已经尝试过你的用例,它确实提供了有效的结果,而无需提供特定于文化的比较器(在.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);