Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何按德语电话簿字母表对字符串排序_C#_Sorting_Cultureinfo - Fatal编程技术网

C# 如何按德语电话簿字母表对字符串排序

C# 如何按德语电话簿字母表对字符串排序,c#,sorting,cultureinfo,C#,Sorting,Cultureinfo,我正在尝试使用德语字母的电话簿顺序对字符串列表进行排序。在德语字母排序中,特殊字符或UMLAUT表示为: Ä->ae Ö->oe Ü->ue 因此,升序排序顺序应该是这样的: 广告 Ä Af 我在C#universe工作,一直在使用CultureInfo为排序创建一个新的字符串比较器。使用此函数,我得到以下顺序: Ä 广告 Af List<string> l = new List<string>(); l.Add("Ad"); l.Add("Ä"); l.Add("Af"

我正在尝试使用德语字母的电话簿顺序对字符串列表进行排序。在德语字母排序中,特殊字符或UMLAUT表示为:

  • Ä->ae
  • Ö->oe
  • Ü->ue
  • 因此,升序排序顺序应该是这样的:

  • 广告
  • Ä
  • Af
  • 我在C#universe工作,一直在使用CultureInfo为排序创建一个新的字符串比较器。使用此函数,我得到以下顺序:

  • Ä
  • 广告
  • Af

    List<string> l = new List<string>();
    l.Add("Ad");
    l.Add("Ä");
    l.Add("Af");
    
    var comparer = StringComparer.Create(CultureInfo.CreateSpecificCulture("de"), true);
    var x = l.OrderBy(y => y, comparer);
    
    foreach(var outp in x) {
        Console.WriteLine(outp);
    }
    
    List l=新列表();
    l、 添加(“广告”);
    l、 添加(“Ä”);
    l、 添加(“Af”);
    var comparer=StringComparer.Create(CultureInfo.CreateSpecificCulture(“de”),true;
    var x=l.OrderBy(y=>y,比较器);
    foreach(x中的var输出){
    控制台写入线(输出);
    }
    

  • 有人知道我如何使用自定义比较器或使用现有的区域性比较器来执行此操作吗?

    您可以实现自己的比较器类,在比较两个字符串之前替换umlauts:

    class CustomStringComparer : IComparer<string>
    {
    
        private string ReplaceUmlauts(string germanText)
        {
            var map = new Dictionary<char, string>() {
              { 'ä', "ae" },
              { 'ö', "oe" },
              { 'ü', "ue" },
              { 'Ä', "Ae" },
              { 'Ö', "Oe" },
              { 'Ü', "Ue" },
              { 'ß', "ss" }
            };
    
            var res = germanText.Aggregate(
                          new StringBuilder(),
                          (sb, c) => map.TryGetValue(c, out var r) ? sb.Append(r) : sb.Append(c)
                          ).ToString();
    
            return res;
        }
    
        public int Compare(string x, string y)
        {
            var xWithoutUmlauts = ReplaceUmlauts(x);
            var yWithoutUmlauts = ReplaceUmlauts(y);
    
            return StringComparer.CurrentCulture.Compare(xWithoutUmlauts, yWithoutUmlauts);
        }
    }
    
    类CustomStringComparer:IComparer
    {
    私有字符串ReplaceUmlauts(字符串germanText)
    {
    var map=newdictionary(){
    {'a',“ae”},
    {'ö',oe},
    {'u',“ue”},
    {'Ä',“Ae”},
    {'Ö',“Oe”},
    {'Ü',“Ue”},
    {'ß',“ss”}
    };
    var res=germanText.Aggregate(
    新建StringBuilder(),
    (sb,c)=>map.TryGetValue(c,out var r)?sb.Append(r):sb.Append(c)
    ).ToString();
    返回res;
    }
    公共整数比较(字符串x、字符串y)
    {
    var xWithoutUmlauts=ReplaceUmlauts(x);
    var yWithoutUmlauts=替换单元数(y);
    返回StringComparer.CurrentCulture.Compare(xWithoutUmlauts,yWithoutUmlauts);
    }
    }
    
    来自的替换代码

    然后,您只需创建一个新的
    CustomStringComparer
    实例,并将其作为参数添加到
    中。OrderBy
    调用如下:

    var x=l.OrderBy(z=>z,新的CustomStringComparer())

    这将产生以下所需的输出:

  • 广告
  • Ä
  • Af

  • 德语电话簿排序是一种替代排序,可以使用“de-de_phoneb”作为名称而不是使用“de”来激活它。

    如果找不到替代排序,只需调用
    str.Replace(“ä”,“ae”).Replace(…)命令。@RandRandom好的,但排序后我可以替换该值吗?将比较器设置为单例(将构造函数设置为私有并通过静态属性公开实例)是有意义的。