如何让LINQ根据文化订购?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让LINQ根据文化订购?相关的知识,希望对你有一定的参考价值。

假设我有一个带有瑞典语单词的字符串列表:bananäppleapelsindruva

现在我想对这个列表进行排序(请记住,这是真实查询的一个非常简化的版本):

var result = from f in fruits // The list mentioned above
             orderby f
             select f

这将给我:apelsinäpplebanandruva。但是,根据瑞典字母表,我应该得到:apelsinbanandruvaä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:对来自订购系统的多个表的报告的聚合数据进行复杂查询

使用 Linq + 包含订购

如何根据条件按 1 个表达式或 2 个表达式排序?

如何根据键订购字典? [复制]

OrderBy IQueryable 列表基于 LINQ 中的另一个内部列表 [重复]

如何根据区域设置确定年,月,日订购?