首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

请问一个算法?=“1/200;2/300;3/300;4/500;20/600;23/700;24/700;25/700;26/700”

2013-02-25 
请教一个算法?“1/2002/3003/3004/50020/60023/70024/70025/70026/700”请教大家一个算法:主要是为

请教一个算法?=“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++)
                {


                    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;
            });


[解决办法]
            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);

热点排行