【问题标题】:How to sort an alphanumeric list by alphabet order如何按字母顺序对字母数字列表进行排序
【发布时间】:2016-08-17 09:28:57
【问题描述】:

我正在尝试按国家名称对字符串列表进行排序,其中每个字符串元素前面都包含四位数字。但是,我实际上是按每个字符串前面的数字排序的,而不是按国家名称排序的。任何人都可以帮助我如何在排序时忽略字符串中的数字。谢谢。

List<string> lst = new List<string>();
lst.Add("0003 India");
lst.Add("0005 America");
lst.Add("0004 Japan");
lst.Add("0001 Sweden");
lst.Add("0002 Germany");

lst.Sort();

lstSearchResult.DataSource = lst;
lstSearchResult.DataBind();

我得到的输出:

 0001 Sweden
 0002 Germany
 0003 India
 0004 Japan
 0005 America

我其实想要输出

 0005 America
 0002 Germany
 0003 India
 0004 Japan
 0001 Sweden

【问题讨论】:

    标签: c# asp.net arrays list sorting


    【解决方案1】:

    lst.Sort() 不起作用的原因是因为它使用了默认的字符串比较 - 它需要整个字符串进行排序。您要做的是仅按空格后的字符串部分进行排序。这样做:

    你可以使用 Linq 的 .OrderBy 方法对字符串的第二部分进行拆分:

    List<string> lst = new List<string>();
    
    lst.Add("0003 India");
    lst.Add("0005 America");
    lst.Add("0004 Japan");
    lst.Add("0001 Sweden");
    lst.Add("0002 Germany");
    
    lst = lst.OrderBy(item => item.Split(' ').ElementAtOrDefault(1)).ToList();
    
    // Or if always by the string from position 5 onward then:
    lst = lst.OrderBy(p => p.Substring(5)).ToList();
    
    lstSearchResult.DataSource = lst;
    lstSearchResult.DataBind();
    

    【讨论】:

      【解决方案2】:

      如果你确定有四个数字后跟一个空格,你可以使用这个Sort(Comparison&lt;T&gt;)重载:

      lst.Sort((s1, s2) => String.Compare(s1.Substring(5), s2.Substring(5), StringComparison.Ordinal));
      lstSearchResult.DataSource = lst;
      lstSearchResult.DataBind();
      

      【讨论】:

        【解决方案3】:

        作为已经建议的 Linq 查询和 Lambda 表达式的替代方案,您可以编写自己的 IComparer&lt;T&gt; 实现:

        private class MyComparer : IComparer<string>
        {
            public int Compare(string x, string y)
            {
                return x.Substring(5).CompareTo(y.Substring(5));
            }
        }
        

        用法:

        // you can also declare this as static for your class or application
        var comparer = new MyComparer();
        
        // actual sorting:
        lst.Sort(comparer);
        

        【讨论】:

          【解决方案4】:

          您可以在OrderBy 中使用Split 并指定要排序的部分。

          lst.OrderBy(x=>x.Split(' ')[1]);
          

          【讨论】:

            【解决方案5】:

            如果数字 000# 总是 4。你可以这样做:

            List<string> lst = new List<string>();
            lst.Add("0003 India");
            lst.Add("0005 America");
            lst.Add("0004 Japan");
            lst.Add("0001 Sweden");
            lst.Add("0002 Germany");
            
            lst = lst.OrderBy(p => p.Substring(5)).ToList();
            
                lstSearchResult.DataSource = lst;
                lstSearchResult.DataBind();
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多