如何对包含带有变音符号的字母的列表进行排序?
本例中使用的单词组成.
现在我得到一个显示这个的列表:
- báb
- baz
- bez
但我想得到一个显示这个的列表:
- baz
- báb
- bez
将变音符号显示为自己的字母.
有没有办法在C#中做到这一点?
最佳答案 如果您将当前线程的文化设置为您要排序的语言,那么这应该自动运行(假设您不需要一些特殊的自定义排序顺序).像这样
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()不按字典顺序进行比较,但根据我发现的一个来源 确实 – 虽然不能保证.最糟糕的情况是你必须将cx和cy转换成字符串,然后使用默认的字符串比较.