在使用特定文化的同时进行排序 - “BB”可能在丹麦语和挪威语的“AA”之前排在第一位

时间:2013-10-08 08:53:47

标签: c# .net sorting .net-4.0

今天我注意到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

3 个答案:

答案 0 :(得分:7)

事实证明,由于我使用的是丹麦文化设置,因此.NET假定“AA”是丹麦字母“Å”,它位于丹麦语字母的末尾。

将语言环境设置为en-US会给出我预期的排序顺序(“AA”,“BB”,“CC”)。

This article有一些背景信息。

答案 1 :(得分:1)

您还可以使用List.Sort的重载来忽略当前的文化。 Ordinal执行一个独立于当前语言的简单字节比较:

list1.Sort(StringComparer.Ordinal);

Demonstration

以下是一些信息: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();