C# 字符串数组 orderBy 重音字符问题
Posted
技术标签:
【中文标题】C# 字符串数组 orderBy 重音字符问题【英文标题】:C# string array orderBy problem with accent characters 【发布时间】:2020-11-05 07:57:18 【问题描述】:我写了一个小代码来声明一个字符串数组,我尝试使用和不使用 stringCompare 对其进行排序,但结果始终相同。
在我使用cultureInfo的地方使用StringComparer:
var strings = new string[] "asd", "ásd", "álm", "alm" ;
var ci = CultureInfo.GetCultureInfo("hu");
var comp = StringComparer.Create(ci, false);
Console.WriteLine(string.Join(", ", strings.OrderBy(item => item, comp)));
没有StringComparer:
var strings = new string[] "asd", "ásd", "álm", "alm" ;
Console.WriteLine(string.Join(", ", strings.OrderBy(item => item)));
两个结果都是:
alm, álm, asd, ásd
但正确的结果是:
alm, asd, álm, ásd
我做错了什么?
【问题讨论】:
我不会匈牙利语,但似乎使用了不同的排序规则。 Wikipedia 说 a 和 á 是共同排序的:“虽然带有变音符号的字符被认为是单独的字母,但在排序单词时,仅长度不同的元音被视为相同。因此,例如,对 O/Ó 和Ö/Ő在排序上没有区别,但Ö跟在O之后。”。 OTOH,SQL Server 有超过 100 个匈牙利语排序规则。 您可以回答自己的问题,而不是将解决方案添加到您的答案中。 感谢您的正确评论。我修改了它:) 【参考方案1】:你可以只使用Ordinal
字符串比较
var strings = new[] "asd", "ásd", "álm", "alm" ;
Console.WriteLine(string.Join(", ", strings.OrderBy(item => item, StringComparer.Ordinal)));
它给你
alm, asd, álm, ásd
【讨论】:
这重现了 OP 给出的示例,但我仍然不确定 Péter 的“正确结果”究竟是什么意思:一些不同的词汇排序或序数排序。 @KlausGütter 是的,正如你所写。序数比较并不能解决我的问题。匈牙利语 ABC 看起来像这样:a-á-b-c..... 序数比较器从字符串中生成:alm、asd、álm、ásd。但是如果我添加一个新的字符串示例:“bab”,那么结果将是:alm, asd, bab, álm, ásd 找到了解决方案。更新了我的问题。谢谢你们的帮助【参考方案2】:我想我找到了解决方案。如果我将全球 CurrentCulture 设置为“hu”或“hu-HU”,那么单词不会以正确的顺序显示,但我发现了一个额外的匈牙利文化:“hu-HU_technl”。
链接:https://docs.microsoft.com/hu-hu/windows/win32/intl/sort-order-identifiers?redirectedfrom=MSDN
代码:
CultureInfo ci = CultureInfo.GetCultureInfo("hu-HU_technl");
Thread.CurrentThread.CurrentCulture = ci;
var strings = new string[] "brummm", "asd", "ásd", "álm", "alm" ;
Console.WriteLine(string.Join(", ", strings.OrderBy(item => item)));
结果:alm, asd, álm, ásd, brummm
您也可以使用 StringComparer 来达到此目的:
CultureInfo ci = CultureInfo.GetCultureInfo("hu-HU_technl");
var comp = System.StringComparer.Create(ci, false);
var strings = new string[] "brummm", "asd", "ásd", "álm", "alm" ;
Console.WriteLine(string.Join(", ", strings.OrderBy(item => item, comp)));
【讨论】:
以上是关于C# 字符串数组 orderBy 重音字符问题的主要内容,如果未能解决你的问题,请参考以下文章
如何将带有无效字符(重音)的 Pandas 数据框与数组匹配? [复制]
使用 .NET 如何将包含 Latin-1 重音字符的 ISO 8859-1 编码文本文件转换为 UTF-8