如何使用变音符号对列表进行排序而不删除变音符号

时间:2011-03-27 05:21:29

标签: c# sorting diacritics

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

此示例中使用的单词已组成。

现在我得到一个显示这个的列表:

  
      
  • 巴孛
  •   
  • 巴兹
  •   
  •   

但我希望得到一个显示此列表的列表:

  
      
  • 巴兹
  •   
  • 巴孛
  •   
  •   

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

1 个答案:

答案 0 :(得分:2)

如果您将当前线程的文化设置为您要排序的语言,那么这应该是自动运行的(假设您不需要一些特殊的自定义排序顺序)。喜欢这个

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()不按字典顺序进行比较,但根据我发现的一个来源&lt;和&gt;确实 - 虽然不能保证。最糟糕的情况是,您必须将cxcy转换为字符串,然后使用默认的字符串比较。