C#流水码生成 C#流水码的生成:例如 输入str="BPZ1-000001"; 按规则 rule_string="0123456"; 生成nextStr="BPZ1-000002";class string ChangeData(string str,string rule_string){} 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 rule_string="0123456" ....这明显你自家的规则啊,怎么猜得出来。 恩,不错,我的规则是个变量,这样子通用性强。例如:八进制的时候就是ruleString=“01234567”; 十六进制的时候 ruleString=“0123456789ABCDEF”; 甚至3进制我可以传入 ruleString=“012”;以上,不知能明白吗~ 我很想知道,输入str="BPZ1-000001"; 按规则 rule_string="0123456"怎么就 生成nextStr="BPZ1-000002";呢?如果输入的是str="BPZ1-000100";那输出是什么? 楼上:输出为str="BPZ1-000101";请参考以上说明~ 恩,可以这样理解,按你的理解做应该可以满足我的现需求,请继续,谢谢~以下仅供参考,现我程序中还用不到此种扩展。扩展:这个类其实还有一个步阶的问题,相邻的两个流水码的差我暂时定义为步阶。你只传入几进制,其实就是步阶固定为1的情况。存在步阶为其它的情况,例如ruleString=“02468”; OK,我理解了,但是会不会有这种情况:ruleString=“02468”;str="BPZ1-000001";这时候结果是什么呢? 还有,如果是这种情况:str = "BPZ1-000228";rule_string = "02468";结果是什么? 本帖最后由 caozhy 于 2011-07-13 22:36:31 编辑 本帖最后由 caozhy 于 2011-07-13 22:36:47 编辑 回答:rule_next="BPZ1-000240";恩,这位仁兄,应该是高手,考虑的挺全面,ruleString=“02468”;str="BPZ1-000001";这时候结果是什么呢?回答:这个时候会报错。同时初始值也不会生成BPZ1-000001条码,因为这违反了规则~谢谢 试试 static void Main(string[] args) { string str = "BPZ1-000001"; string rule_string = "0123456"; string result = ChangeData(str, rule_string); Console.WriteLine(result); str = "BPZ1-000888"; rule_string = "02468"; result = ChangeData(str, rule_string); Console.WriteLine(result); } static string ChangeData(string str, string rule_string) { char[] cs = rule_string.ToCharArray(); int[] array = Array.ConvertAll<char, int>(cs, c => Convert.ToInt32(c.ToString())); string[] temp = str.Split('-'); int source = int.Parse(temp[1]); int index = Array.IndexOf(cs, str[str.Length - 1]); if (index < 0) throw new ArgumentException(); char[] aChar = temp[1].ToCharArray(); if (index == cs.Length - 1) { int i = aChar.Length - 1; while (i > 0) { aChar[i] = cs[0]; char c = aChar[i - 1]; index = Array.IndexOf(cs, c); if (index != cs.Length - 1) { aChar[i - 1] = cs[index + 1]; break; } else { aChar[i - 1] = cs[0]; i--; } } } else { aChar[aChar.Length - 1] = cs[index + 1]; } return temp[0] + "-" + new string(aChar); } 有两个变量没用: static string ChangeData(string str, string rule_string) { char[] cs = rule_string.ToCharArray(); string[] temp = str.Split('-'); int index = Array.IndexOf(cs, str[str.Length - 1]); if (index < 0) throw new ArgumentException(); char[] aChar = temp[1].ToCharArray(); if (index == cs.Length - 1) { int i = aChar.Length - 1; while (i > 0) { aChar[i] = cs[0]; char c = aChar[i - 1]; index = Array.IndexOf(cs, c); if (index != cs.Length - 1) { aChar[i - 1] = cs[index + 1]; break; } else { aChar[i - 1] = cs[0]; i--; } } } else { aChar[aChar.Length - 1] = cs[index + 1]; } return temp[0] + "-" + new string(aChar); } 恩,上面兩位雖然能實現,但太複雜,我自己寫了個,簡單易懂的,謝謝各位捧場 //******************流水碼生成*************************************** private string[] fenge(string str) { string[] data = new string[str.Length]; for (int i = 0; i < str.Length; i++) { data[i] = str.Substring(i, 1); } return data; } private string changeData(string str, string ruleString) { int i, j, k; string[] s1 = fenge(str); string[] s2 = fenge(ruleString); string newData = string.Empty; i = str.Length - 1; j = ruleString.Length - 1; while (i > 0) { if (s1[i] == s2[j]) { s1[i] = s2[0]; i--; } else { for (k = 0; k <= j; k++) { if (s1[i] != s2[k]) { continue; } else { s1[i] = s2[k + 1]; i = 0; break; } } } } for (i = 0; i < s1.Length; i++) { newData = newData + s1[i]; } return newData; } 介绍一个制作软件的思路: String 截取字符的问题 C# 如何移除集合中含有某关键字的元素 如何使一个循环的窗体播放停留时间延长 关于gdi的问题 C# 属性怎样指定类别 oracle中的怎么操作参数形式 请教,如何遍历提取字符串数组中包含的某个字符 C#中,string类获得某个字符的位置是什么函数? 问一个问题:关于treeview控件的sSelectedNodeIndex 前端显示 如何使用WINXP自带的图片浏览器查看SQL数据库表中二进制保存的图片
这明显你自家的规则啊,怎么猜得出来。
例如:八进制的时候就是ruleString=“01234567”;
十六进制的时候 ruleString=“0123456789ABCDEF”;
甚至3进制我可以传入 ruleString=“012”;
以上,不知能明白吗~
怎么就 生成nextStr="BPZ1-000002";呢?
如果输入的是str="BPZ1-000100";
那输出是什么?
请参考以上说明~
扩展:
这个类其实还有一个步阶的问题,相邻的两个流水码的差我暂时定义为步阶。你只传入几进制,其实就是步阶固定为1的情况。存在步阶为其它的情况,例如ruleString=“02468”;
ruleString=“02468”;str="BPZ1-000001";
这时候结果是什么呢?
str = "BPZ1-000228";rule_string = "02468";
结果是什么?
恩,这位仁兄,应该是高手,考虑的挺全面,ruleString=“02468”;str="BPZ1-000001";
这时候结果是什么呢?
回答:这个时候会报错。同时初始值也不会生成BPZ1-000001条码,因为这违反了规则~谢谢
{
string str = "BPZ1-000001";
string rule_string = "0123456";
string result = ChangeData(str, rule_string);
Console.WriteLine(result);
str = "BPZ1-000888";
rule_string = "02468";
result = ChangeData(str, rule_string);
Console.WriteLine(result);
} static string ChangeData(string str, string rule_string)
{
char[] cs = rule_string.ToCharArray();
int[] array = Array.ConvertAll<char, int>(cs, c => Convert.ToInt32(c.ToString()));
string[] temp = str.Split('-');
int source = int.Parse(temp[1]);
int index = Array.IndexOf(cs, str[str.Length - 1]);
if (index < 0)
throw new ArgumentException();
char[] aChar = temp[1].ToCharArray();
if (index == cs.Length - 1)
{
int i = aChar.Length - 1;
while (i > 0)
{
aChar[i] = cs[0];
char c = aChar[i - 1];
index = Array.IndexOf(cs, c);
if (index != cs.Length - 1)
{
aChar[i - 1] = cs[index + 1];
break;
}
else
{
aChar[i - 1] = cs[0];
i--;
}
}
}
else
{
aChar[aChar.Length - 1] = cs[index + 1];
}
return temp[0] + "-" + new string(aChar);
}
{
char[] cs = rule_string.ToCharArray();
string[] temp = str.Split('-');
int index = Array.IndexOf(cs, str[str.Length - 1]);
if (index < 0)
throw new ArgumentException();
char[] aChar = temp[1].ToCharArray();
if (index == cs.Length - 1)
{
int i = aChar.Length - 1;
while (i > 0)
{
aChar[i] = cs[0];
char c = aChar[i - 1];
index = Array.IndexOf(cs, c);
if (index != cs.Length - 1)
{
aChar[i - 1] = cs[index + 1];
break;
}
else
{
aChar[i - 1] = cs[0];
i--;
}
}
}
else
{
aChar[aChar.Length - 1] = cs[index + 1];
}
return temp[0] + "-" + new string(aChar);
}
//******************流水碼生成***************************************
private string[] fenge(string str)
{
string[] data = new string[str.Length]; for (int i = 0; i < str.Length; i++)
{
data[i] = str.Substring(i, 1);
}
return data; }
private string changeData(string str, string ruleString)
{
int i, j, k;
string[] s1 = fenge(str);
string[] s2 = fenge(ruleString);
string newData = string.Empty;
i = str.Length - 1;
j = ruleString.Length - 1;
while (i > 0)
{
if (s1[i] == s2[j])
{
s1[i] = s2[0];
i--;
}
else
{
for (k = 0; k <= j; k++)
{
if (s1[i] != s2[k])
{
continue;
}
else
{
s1[i] = s2[k + 1];
i = 0;
break;
} }
}
}
for (i = 0; i < s1.Length; i++)
{
newData = newData + s1[i];
}
return newData;
}