如何让LINQ根据文化订购?

时间:2009-12-04 10:52:16

标签: c# linq sorting

假设我有一个包含瑞典语单词的字符串列表: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不变?

2 个答案:

答案 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);