如何让LINQ根据文化订购?

问题描述 投票:19回答:2

假设我有一个带有瑞典语单词的字符串列表: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完好无损?

c# linq sorting
2个回答
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));

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);
© www.soinside.com 2019 - 2024. All rights reserved.