我跑了这个:
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
可能是什么问题呢?
我跑了这个:
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
可能是什么问题呢?
我已经意识到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
发生这种情况是因为您的默认比较器首先按长度排序。您没有尝试对包含混合案例的集合进行排序,例如:
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