【问题标题】:How to sort list with diacritics without removing diacritic如何在不删除变音符号的情况下对带有变音符号的列表进行排序
【发布时间】:2011-03-27 05:21:29
【问题描述】:

如何对包含带有变音符号的字母的列表进行排序?

本例中使用的单词是编造的。

现在我得到一个显示此内容的列表:

  • 巴布
  • 巴兹
  • bez

但我想得到一个显示这个的列表:

  • 巴兹
  • 巴布
  • bez

将变音符号单独显示为字母。 有没有办法在 C# 中做到这一点?

【问题讨论】:

  • 更新:不把变音符号放在字母的末尾。
  • 这是某种语言的标准排序顺序吗?

标签: c# sorting diacritics


【解决方案1】:

如果您将当前线程的文化设置为您想要排序的语言,那么这应该会自动工作(假设您不想要一些特殊的自定义排序顺序)。像这样

List<string> mylist;
....
Thread.CurrentThread.CurrentCulture = new CultureInfo("pl-PL");
mylist.Sort();

应该让您根据波兰文化设置排序列表。

更新:如果文化设置没有按照您想要的方式对其进行排序,那么另一种选择是实现您自己的字符串比较器。

更新 2:字符串比较器示例:

public class DiacriticStringComparer : IComparer<string>
{
    private static readonly HashSet<char> _Specials = new HashSet<char> { 'é', 'ń', 'ó', 'ú' };

    public int Compare(string x, string y)
    {
        // handle special cases first: x == null and/or y == null,  x.Equals(y)
        ...

        var lengthToCompare = Math.Min(x.Length, y.Length);
        for (int i = 0; i < lengthToCompare; ++i)
        {
            var cx = x[i];
            var cy = y[i];

            if (cx == cy) continue;

            if (_Specials.Contains(cx) || _Specials.Contains(cy))
            {
                // handle special diacritics comparison
                ...
            }
            else
            {
                // cx must be unequal to cy -> can only be larger or smaller
                return cx < cy ? -1 : 1;
            }
        }
        // once we are here the strings are equal up to lengthToCompare characters
        // we have already dealt with the strings being equal so now one must be shorter than the other
        return x.Length < y.Length ? -1 : 1;
    }
}

免责声明:我尚未对其进行测试,但它应该可以为您提供总体思路。 char.CompareTo() 也没有按字典顺序进行比较,但根据我发现 的一个来源,虽然不能保证。最坏的情况你必须将cxcy 转换为字符串,然后使用默认的字符串比较。

【讨论】:

  • 我对波兰语的简单测试返回báb, baz, bez
  • 我想要一种具有以下字母的文化:é、ń、ó 和 ú。并将它们分别放在 e、n、o 和 u 之后。我找到了冰岛语,他有 4 个字母中的 3 个,但我想要一个包含所有四个字母的。有人知道这样的文化吗?
  • 你能给我一个这样的字符串比较器的例子吗?
  • @Mat 我忍不住评论说“找到一种分类规则有效的文化”就像用抹子翻煎饼一样。此处可能有更多信息stackoverflow.com/questions/359827/…,您可能想对此进行更多搜索。我发现它在 Google 搜索中排名第一。
  • @Shibumi 我不想像你写的链接中所说的那样删除变音符号。我知道没有这样的文化。这就是为什么我要求另一种方法来做到这一点,例如 ChrisWue 作为答案写的方法。 @ChrisWue 谢谢你的帮助,我去试试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 2011-04-15
  • 2022-01-03
  • 1970-01-01
  • 2019-03-03
相关资源
最近更新 更多