C#中的字符串排序错误

时间:2015-10-29 17:30:09

标签: c# string linq currentculture stringcomparer

我跑了这个:

void Main()
{
    List<string> strings = new List<string>{"aaa", "z", "a"};
    Console.WriteLine(string.Join("\n", strings.OrderBy(k => k)));
}

输出是:

a
z
aaa

这不可能是对的!我在期待

a
aaa
z

可能是什么问题?

2 个答案:

答案 0 :(得分:12)

我意识到OrderBy使用当前的语言环境对字符串进行排序。在我的例子中,语言环境是丹麦语,其中“aa”在“z”之后,因为它代表字母“å”,它附加在字母表的末尾。

这对我来说是一个惊喜,因为我期待英语排序,我没有意识到该地区一直是丹麦人;我系统上的许多其他设置都设置为英语,包括语言。这欺骗了我的期望是错误的。

要获得我期望的排序,将StringComparer.InvariantCulture传递给OrderBy就足够了:

void Main()
{
    List<string> strings = new List<string>{"aaa", "z", "a"};
    Console.WriteLine(string.Join("\n", strings.OrderBy(k => k, StringComparer.InvariantCulture)));
}

输出:

a
aaa
z

答案 1 :(得分:1)

发生这种情况是因为您的默认比较器首先按长度排序。您没有尝试使用混合案例对集合进行排序,例如:

List<string> strings = new List<string>{"aaa", "D", "z", "a"};

在elnigno发布的答案中,它会产生如下输出:

a
aaa
D
z

如果您需要按照编码表中的代码订购它们,那么您很可能会更喜欢这种方式:

var keywords = new List<string> { "aaa", "D", "z", "a" };
Console.WriteLine(string.Join("\n", keywords.OrderBy(k => k, StringComparer.Ordinal)));

输出将如下:

D
a
aaa
z