假设我有一个包含瑞典语单词的字符串列表: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
,但这似乎并没有真正影响它。我是否必须编写自己的lambda函数并使用.OrderBy(...)
或者我还能做些什么来保持LINQ不变?
答案 0 :(得分:34)
您无法使用查询表达式执行此操作,但可以使用显式点表示法执行此操作:
var result = fruits.OrderBy(f => f, StringComparer.CurrentCulture);
应该这样做,假设线程的当前文化是正确的。可替换地:
CultureInfo culture = new CultureInfo("sv-SE");
var result = fruits.OrderBy(f => f, StringComparer.Create(culture, false));
答案 1 :(得分: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);