在list中,要对一个机器名字段排序,如下格式:
“P-1,P-11,P-2,S-3,C-2,C-1”,想要得到如下格式:
“C-1,C-2,P-1,P-2,P-11,S-3”有什么好的解决办法?
有没有类似“list.Orderby(t=>int.Parse(Regex.Mash(...)))”这种做法?注:
目前的做法:对list循环遍历,重新比较之后再绑定。

解决方案 »

  1.   

    直接用List.Sort(void)就可以实现你要的效果了,
      

  2.   

    如果记录少,直接用类似Orderby(t=>int.Parse(Regex...没有什么问题。
    如果记录非常非常多,可以先切开,再比较。
      

  3.   


    void Main()
    {
    string str="P-1,P-11,P-2,S-3,C-2,C-1";
    var query=from s in str.Split(',')
              let t=s.Split('-')
      orderby t[0] , int.Parse(t[1])
      select s;
    query.ToList().ForEach(q=>Console.WriteLine(q));
    /*
    C-1
    C-2
    P-1
    P-2
    P-11
    S-3 */
    }
      

  4.   

    简单一点,可以这样写:string str="P-1,P-11,P-2,S-3,C-2,C-1";
    var query=str.Split(',').OrderBy(s=>s.Split('-')[0]).ThenBy(s=>int.Parse(s.Split('-')[1]));
      

  5.   

    Split + OrderBy ThenBy 是个好办法。但要通用性高,还得正则。
      

  6.   

    多谢Tim [兔子党执行督察]的回复,我的数据中貌似还有“S-A,S-B”的数据,所以
    var query=str.Split(',').OrderBy(s=>s.Split('-')[0]).ThenBy(s=>int.Parse(s.Split('-')[1]));
    不行
      

  7.   

    S-A 和 S-B 你打算怎么排
      

  8.   


    排成“S-1, S-2, S-A, S-B”
      

  9.   

    我不会正则 
    public class CustomComparer : IComparer<string>
        {
            int IComparer<string>.Compare(string x, string y)
            {
                int result = 0;
                string[] arrX = x.Split('-'), arrY = y.Split('-');            if ((result = arrX[0].CompareTo(arrY[0])) != 0)
                    return result;            if (arrX.Length > 1 && arrY.Length > 1)
                {
                    int tempX, tempY;
                    if (int.TryParse(arrX[1], out tempX) && int.TryParse(arrY[1], out tempY))
                    {
                        return tempX.CompareTo(tempY);
                    }
                    else
                    {
                        return arrX[1].CompareTo(arrY[1]);
                    }
                }
                return arrX.Length > arrY.Length ? 1 : -1;
                //throw new NotImplementedException();
            }
        }List<string> sortList = new List<string>("P-1,S-B,P-11,P-2,S-3,S-A,C-2,C-1".Split(','));
                sortList = sortList.OrderBy(a => a, new CustomComparer()).ToList();            foreach (var ss in sortList)
                {
                    Console.WriteLine("{0}", ss);
                }