一个简单的代码示例,让我们尝试对俄语字符数组进行排序:
var a = new char[]
{
'д',
'е',
'ё',
'ж'
};
var b = a.OrderBy(x => x).ToList();
Console.WriteLine(string.Concat(b));
这个简单的代码乍一看会给出一些意想不到的东西дежё,但这里的 c# 恰好符合标准,因为字母ё的代码比俄语字母表中所有其他字母的代码都大。
让我们尝试对一个字符串数组进行排序,其中一个字符串包含字母ё:
var a = new string[]
{
"жар",
"дом",
"ели",
"ёлка",
};
var b = a.OrderBy(x => x).ToList();
Console.WriteLine(string.Join(" ", b));
我们得到了我们所期望дом ели ёлка жар的。这些行似乎按预期排序。
让我们尝试ели替换为ель. 我们会好起来的дом ёлка ель жар。显然,在对字符串进行排序时,e和e被认为是一个字符,在第二种情况下ёлка它变成 beforeель因为k在b之前。
我对提议的字符串数组排序算法的天真理解表明它应该使用与字符数组排序相同的字符代码比较算法。这显然不会发生。算法的预期修改是考虑到俄语字母表中的ё仍然不在 unicode 中的位置这一事实。但实际上,我们有一个实现,其中e和e是一个字符。
我对几个问题感兴趣。字符串排序算法具体定义在哪里?我通过 ReferenceSource 的旅程将我带到了 GitHub CLR 的某个地方,我不确定我是否在朝着正确的方向前进。为什么决定将e和ё用于一个字符,而不是实施公平排序?是某人的任性决定还是仍然在某些规范中定义?
我了解并非所有问题都意味着社区普通成员的明确回答,但我在此提及。
或者也许我误解了一切,如果是这样的话请纠正我。
谢谢你。