5

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

4

3 回答 3

9

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

将语言环境设置为en-US我期望的排序顺序(“AA”、“BB”、“CC”)。

这篇文章有一些背景信息。

于 2013-10-08T08:53:46.600 回答
2

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

list1.Sort(StringComparer.Ordinal);

Demonstration

以下是一些信息:规范化和排序

一些 Unicode 字符具有多个等效的二进制表示,由组合和/或复合 Unicode 字符集组成。因此,两个字符串可能看起来相同,但实际上由不同的字符组成。单个字符的多个表示的存在使排序操作复杂化。这个问题的解决方案是对每个字符串进行规范化,然后使用序数比较对字符串进行排序......

于 2013-10-08T09:21:20.343 回答
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();
于 2013-10-08T09:13:21.257 回答