一个简单的序列生成规则

  RT,直接上代码,希望能够得到一些指点。

 

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.IO;
using System.Threading;

namespace WebTest
{
    public partial class _Default : System.Web.UI.Page
    {
        //定义应用的字符集
        private static readonly char[] WORD = {
                                                  '0', '1', '2', '3', '4', '5', '6', '7', '8', 
                                                  '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 
                                                  'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 
                                                  'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
                                              };
        //private static readonly char[] WORD = {
        //                                          '0', '1', '2'
        //                                      };

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                this.CreateIdentity();
            }
        }

        private void CreateIdentity()
        {
            try
            {
                // 获取排他锁
                Monitor.Enter(WORD);
                // 声明目标文件路径
                string strPath = Server.MapPath(@"Identity\" + DateTime.Now.ToString("yyyyMMdd") + ".txt");
                // 如果不存在则创建该文件
                if (!File.Exists(strPath))
                {
                    File.Create(strPath).Close();
                }
                // 打开文件
                FileStream fs = File.OpenRead(strPath);
                // 套接读取流
                StreamReader sr = new StreamReader(fs);
                // 读取数据
                string strTemp = sr.ReadToEnd();
                // 关闭打开的流
                sr.Close();
                fs.Close();

                if (string.IsNullOrEmpty(strTemp))
                {
                    strTemp = "00000";
                }
                else
                {
                    char[] chsTemp = strTemp.ToCharArray();

                    // 第五位的索引以及是否回归的标识
                    int index4 = 0;
                    bool flag4 = false;

                    // 第四位的索引以及是否回归的标识
                    int index3 = 0;
                    bool flag3 = false;

                    // 第三位的索引以及是否回归的标识
                    int index2 = 0;
                    bool flag2 = false;

                    // 第二位的索引以及是否回归的标识
                    int index1 = 0;
                    bool flag1 = false;

                    // 第一位的索引以及是否回归的标识
                    int index0 = 0;
                    bool flag0 = false;

                    // 开始检索序列
                    for (int i = 0; i < WORD.Length; i++)
                    {
                        // 检索第五位
                        if (chsTemp[4] == WORD[i])
                        {
                            // 如果当前索引已经是最大时,则回归并标记"已回归";否则进一位
                            if (i == WORD.Length - 1)
                            {
                                index4 = 0;
                                flag4 = true;
                            }
                            else
                            {
                                index4 = i + 1;
                            }
                        }
                        // 检索第四位
                        if (chsTemp[3] == WORD[i])
                        {
                            // 如果当前索引已经是最大时,则回归并标记"已回归";否则进一位
                            if (i == WORD.Length - 1)
                            {
                                index3 = 0;
                                flag3 = true;
                            }
                            else
                            {
                                index3 = i + 1;
                            }
                        }
                        // 检索第三位
                        if (chsTemp[2] == WORD[i])
                        {
                            // 如果当前索引已经是最大时,则回归并标记"已回归";否则进一位
                            if (i == WORD.Length - 1)
                            {
                                index2 = 0;
                                flag2 = true;
                            }
                            else
                            {
                                index2 = i + 1;
                            }
                        }
                        // 检索第二位
                        if (chsTemp[1] == WORD[i])
                        {
                            // 如果当前索引已经是最大时,则回归并标记"已回归";否则进一位
                            if (i == WORD.Length - 1)
                            {
                                index1 = 0;
                                flag1 = true;
                            }
                            else
                            {
                                index1 = i + 1;
                            }
                        }
                        // 检索第一位
                        if (chsTemp[0] == WORD[i])
                        {
                            // 如果当前索引已经是最大时,则回归并标记"已回归";否则进一位
                            if (i == WORD.Length - 1)
                            {
                                index0 = 0;
                                flag0 = true;
                            }
                            else
                            {
                                index0 = i + 1;
                            }
                        }
                    }

                    // 如果所有位都回归则表示组合序列已达到极限
                    if (flag4 && flag3 && flag2 && flag1 && flag0)
                    {
                        Response.Write("已经达到最大限度!");
                    }
                    else
                    {
                        // 第一位
                        if (flag4 && flag3 && flag2 && flag1 && !flag0)
                        {
                            strTemp = WORD[index0].ToString();
                        }
                        else if (flag0)
                        {
                            if (!flag4 || !flag3 || !flag2 || !flag1)
                            {
                                strTemp = WORD[WORD.Length - 1].ToString();
                            }
                            else
                            {
                                strTemp = WORD[index0].ToString();
                            }
                        }
                        else
                        {
                            strTemp = WORD[index0 - 1].ToString();
                        }

                        // 第二位
                        if (flag4 && flag3 && flag2)
                        {
                            strTemp += WORD[index1].ToString();
                        }
                        else if (flag1)
                        {
                            if (!flag4 || !flag3 || !flag2)
                            {
                                strTemp += WORD[WORD.Length - 1].ToString();
                            }
                            else
                            {
                                strTemp += WORD[index1].ToString();
                            }
                        }
                        else
                        {
                            strTemp += WORD[index1 - 1].ToString();
                        }

                        // 第三位
                        if (flag4 && flag3)
                        {
                            strTemp += WORD[index2].ToString();
                        }
                        else if (flag2)
                        {
                            if (!flag4 || !flag3)
                            {
                                strTemp += WORD[WORD.Length - 1].ToString();
                            }
                            else
                            {
                                strTemp += WORD[index2].ToString();
                            }
                        }
                        else
                        {
                            strTemp += WORD[index2 - 1].ToString();
                        }

                        // 第四位
                        if (flag4)
                        {
                            strTemp += WORD[index3].ToString();
                        }
                        else if (!flag4 && flag3)
                        {
                            strTemp += WORD[WORD.Length - 1].ToString();
                        }
                        else
                        {
                            strTemp += WORD[index3 - 1].ToString();
                        }

                        // 第五位
                        strTemp += WORD[index4].ToString();
                    }
                }

                StreamWriter sw = new StreamWriter(strPath, false, System.Text.Encoding.Default);
                sw.Write(strTemp);
                sw.Flush();
                sw.Close();
                fs.Close();

                sr = null;
                sw = null;
                fs = null;

                Response.Write(DateTime.Now.ToString("yyMMdd") + strTemp);
            }
            catch (Exception ex)
            {
                Response.Write(ex.Message);
            }
            finally
            {
                Monitor.Exit(WORD);
                Response.Write(" Over!");
            }
        }

    }
}

 

运行效果的话,可以自己跑一下看看。

posted @ 2010-10-27 23:18  東 無盡  阅读(360)  评论(0编辑  收藏  举报