日期:2014-05-17  浏览次数:20972 次

请教一个算法?=“1/200;2/300;3/300;4/500;20/600;23/700;24/700;25/700;26/700”
请教大家一个算法:
主要是为了实现仓库出库时箱号的一个编辑问题:
比如 
   原箱号=“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”,最终累计前面的箱号字符串返回结果保存。

不知道有没有好点的方法可以实现这个效果。。。

------解决方案--------------------
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整理好以后在循环比较划算
------解决方案--------------------
  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()));

------解决方案--------------------
纯属写着玩的,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++)
                {