C#流水码的生成:例如 输入str="BPZ1-000001"; 按规则 rule_string="0123456"; 生成nextStr="BPZ1-000002";class string ChangeData(string str,string rule_string)
{}

解决方案 »

  1.   

    rule_string="0123456" ....
    这明显你自家的规则啊,怎么猜得出来。
      

  2.   

    恩,不错,我的规则是个变量,这样子通用性强。
    例如:八进制的时候就是ruleString=“01234567”; 
          十六进制的时候  ruleString=“0123456789ABCDEF”;
          甚至3进制我可以传入 ruleString=“012”;
    以上,不知能明白吗~
     
      

  3.   

    我很想知道,输入str="BPZ1-000001"; 按规则 rule_string="0123456"
    怎么就 生成nextStr="BPZ1-000002";呢?
    如果输入的是str="BPZ1-000100";
    那输出是什么?
      

  4.   

    楼上:输出为str="BPZ1-000101";
    请参考以上说明~
      

  5.   

    恩,可以这样理解,按你的理解做应该可以满足我的现需求,请继续,谢谢~以下仅供参考,现我程序中还用不到此种扩展。
    扩展:
    这个类其实还有一个步阶的问题,相邻的两个流水码的差我暂时定义为步阶。你只传入几进制,其实就是步阶固定为1的情况。存在步阶为其它的情况,例如ruleString=“02468”;
      

  6.   

    OK,我理解了,但是会不会有这种情况:
    ruleString=“02468”;str="BPZ1-000001";
    这时候结果是什么呢?
      

  7.   

    还有,如果是这种情况:
    str = "BPZ1-000228";rule_string = "02468";
    结果是什么?
      

  8.   

    本帖最后由 caozhy 于 2011-07-13 22:36:31 编辑
      

  9.   

    本帖最后由 caozhy 于 2011-07-13 22:36:47 编辑
      

  10.   

    回答:rule_next="BPZ1-000240";
    恩,这位仁兄,应该是高手,考虑的挺全面,ruleString=“02468”;str="BPZ1-000001";
    这时候结果是什么呢?
    回答:这个时候会报错。同时初始值也不会生成BPZ1-000001条码,因为这违反了规则~谢谢
      

  11.   

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

  12.   

    有两个变量没用:        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);
            }
      

  13.   

    恩,上面兩位雖然能實現,但太複雜,我自己寫了個,簡單易懂的,謝謝各位捧場
            
    //******************流水碼生成***************************************
            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;
            }