如何让LINQ根据文化订购?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让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
,但这似乎并没有真正影响它。我是否必须编写自己的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);
以上是关于如何让LINQ根据文化订购?的主要内容,如果未能解决你的问题,请参考以下文章
LINQ to SQL:对来自订购系统的多个表的报告的聚合数据进行复杂查询