【问题标题】:C# string array orderBy problem with accent charactersC# 字符串数组 orderBy 重音字符问题
【发布时间】: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 个匈牙利语排序规则。
  • 您可以回答自己的问题,而不是将解决方案添加到您的答案中。
  • 感谢您的正确评论。我修改了它:)

标签: c# arrays string linq


【解决方案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)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    相关资源
    最近更新 更多