请教大家一个算法:
主要是为了实现仓库出库时箱号的一个编辑问题:
比如 
   原箱号=“1/200;2/300;3/300;4/500;20/600;23/700;24/700;25/700;26/700”
代表料品A,在第一箱中有200个,第二箱中有300个,第三箱中有300个,以此类推。
我想要实现的效果是:
最终把上面的箱号转换成这样的格式
“1/200;2-3/300;4/500;20/600;23-26/700;”这样的格式。
也就是说,紧挨着的箱如果数量一致,中间用“-”隔开,最后加一个“/”和数量;
比如上面的“23/700;24/700;25/700;26/700” :从23箱到26箱数量都是700,则变成“23-26/700”,最终累计前面的箱号字符串返回结果保存。不知道有没有好点的方法可以实现这个效果

解决方案 »

  1.   

    split ;
    split /
    分割成二维数组 
    然后循环呗
      

  2.   

    分号split分割维数组,自己转换
      

  3.   

    知道用Split,就是组合的时候有点不知所措
      

  4.   

    string old="1/200;2/300;3/300;4/500;20/600;23/700;24/700;25/700;26/700";
              var res = string.Join(";", old.Split(';').GroupBy(p => Convert.ToInt32(p.Split('/')[1])).Select(p => String.Join("-", p.Select(c => c.Split('/')[0])) + "/" + p.Key.ToString()));当然我这是写这好玩滴,实际项目中应该先split整理好以后在循环比较划算
      

  5.   

      var res1 = string.Join(";",
                    old.Split(';')
                    .Select(p =>
                {
                    var t = p.Split('/');
                    return new { id = t[0], num = Convert.ToInt32(t[1]) };
                })
                .GroupBy(p => p.num)
                .Select(p => string.Join("-", p.Select(c => c.id)) + "/" + p.Key.ToString()));
      

  6.   

    纯属写着玩的,lz还是用split吧,split后再遍历组合起来
     string str = "1/200;2/300;3/300;4/500;20/600;23/700;24/700;25/700;26/700";
                //str = Regex.Replace(str, @"(\d+)/(\d+);((\d+)/\2(;|$))+", "$1-$4/$2;");
                str = Regex.Replace(str, @"(\d+)/(\d+);((\d+)/\2(;|$))+", delegate(Match m)
                {
                    string s = "";
                    int n = Convert.ToInt32(m.Groups[1].Value);
                    var list = m.Groups[4].Captures.OfType<Capture>().Select(t => Convert.ToInt32(t.Value)).ToList();
                    for (int i = 0; i < list.Count; i++)
                    {
                        if (i == list.Count - 1 || list[i] - n != i + 1)
                        {
                            s += string.Format("{0}-{1}/{2};", n, list[i], m.Groups[2].Value);
                            n = list[i];
                        }
                    }
                    return s;
                });
      

  7.   

                String sssssssss = "1/200;2/300;3/300;4/500;20/600;23/700;24/700;25/700;26/700";
                String[] aaaarrr = sssssssss.Split(';');
                StringBuilder sb = new StringBuilder();
                String strStart = String.Empty;
                String strEnd = String.Empty;
                bool isTrue = false;
                for (int i = 0; i < aaaarrr.Length - 1; i++)
                {
                    String[] start = aaaarrr[i].Split('/');
                    String[] end = aaaarrr[i + 1].Split('/');
                    if (start[1].Equals(end[1]))
                    {
                        if (int.Parse(start[0]) == (int.Parse(end[0]) - 1))
                        {
                            if (isTrue == false)
                            {
                                strStart = start[0];
                                strEnd = end[0];
                                isTrue = true;
                            }
                            else
                            {
                                strEnd = end[0];
                            }
                        }
                        else
                        {
                            if (isTrue == true)
                            {
                                sb.Append(";" + strStart + "-" + strEnd + "/" + start[1]);
                                isTrue = false;
                            }
                            else
                            {
                                sb.Append(";" + aaaarrr[i]);
                            }
                        }
                    }
                    else
                    {
                        if (isTrue == true)
                        {
                            sb.Append(";" + strStart + "-" + strEnd + "/" + start[1]);
                            isTrue = false;
                        }
                        else
                        {
                            sb.Append(";" + aaaarrr[i]);
                        }
                    }
                    if (i == aaaarrr.Length - 2)
                    {
                        if (isTrue == true)
                        {
                            sb.Append(";" + strStart + "-" + end[0] + "/" + start[1]);
                        }
                        else
                        {
                            sb.Append(";" + aaaarrr[i + 1]);
                        }
                    }
                }            String res = sb.ToString().Substring(1);