请教大家一个算法:
主要是为了实现仓库出库时箱号的一个编辑问题:
比如
原箱号=“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/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”,最终累计前面的箱号字符串返回结果保存。不知道有没有好点的方法可以实现这个效果
split /
分割成二维数组
然后循环呗
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整理好以后在循环比较划算
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()));
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[] 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);