今天我注意到C#中有一个有趣的排序行为。我有两个列表,我对它们进行排序:
var list1 = new List<string> { "A", "B", "C" };
var list2 = new List<string> { "AA", "BB", "CC" };
list1.Sort();
list2.Sort();
这两个列表现在包含:
>> list1
[0]: "A"
[1]: "B"
[2]: "C"
>> list2
[0]: "BB"
[1]: "CC"
[2]: "AA"
AA为什么最终放弃?
以下是演示:http://ideone.com/QCeUjx
答案 0 :(得分:7)
事实证明,由于我使用的是丹麦文化设置,因此.NET假定“AA”是丹麦字母“Å”,它位于丹麦语字母的末尾。
将语言环境设置为en-US
会给出我预期的排序顺序(“AA”,“BB”,“CC”)。
This article有一些背景信息。
答案 1 :(得分:1)
您还可以使用List.Sort
的重载来忽略当前的文化。 Ordinal
执行一个独立于当前语言的简单字节比较:
list1.Sort(StringComparer.Ordinal);
以下是一些信息:Normalization and Sorting
某些Unicode字符具有多个等效二进制文件 由组合和/或复合组成的表示 Unicode字符。因此,两个字符串可以看起来相同但是 实际上由不同的字符组成。存在多重 单个字符的表示使排序操作复杂化。 这个问题的解决方案是规范化每个字符串,然后使用 用于排序字符串的序数比较 ....
答案 2 :(得分:0)
是的,您可以使用以下代码行更改当前的区域设置。
var list1 = new List<string> { "A", "B", "C" };
var list2 = new List<string> { "BB", "AA", "CC" };
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
list1.Sort();
list2.Sort();