【C#】【Demo】生成編號算法

using System;
using System.Collections.Generic;
using System.Linq;

namespace CommonUtil
{

    /// <summary>
    /// 公共簡易算法
    /// </summary>
    public static class UtilAlgorithm
    {
        #region 生成編號
        //生成編號顯示字符,原始
        static readonly char[] NO_patternOld = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'X', 'Y' };
        //生成編號顯示字符,亂序
        static readonly char[] NO_pattern = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'X', 'Y' };
        static readonly List<char> NO_patternList = NO_pattern.ToList();
        /// <summary>
        /// 生成編號
        /// </summary>
        /// <param name="len">編號位數</param>
        /// <param name="v">編號數值</param>
        /// <returns></returns>
        public static string NO_CreateNumberString(int len, out int[] v)
        {
            //生成len個小於_pattern.Length的整數
            Random random = new Random(~unchecked((int)DateTime.Now.Ticks));
            v = new int[len];
            string nu = "";
            for (int i = 0; i < len; i++)
            {
                v[i]= random.Next(0, NO_pattern.Length);
                nu += NO_pattern[v[i]];
            }
            return nu;
        }

        /// <summary>
        /// 下一個編號
        /// </summary>
        /// <returns></returns>
        public static string NO_NumberStringNext(string nu)
        {
            var v = NO_NumberStringToInts(nu);
            v = NO_IntsNext(v);
            return NO_IntsToNumberString(v);
        }

        /// <summary>
        /// int數組轉編號字符
        /// </summary>
        /// <param name="nu"></param>
        /// <returns></returns>
        public static string NO_IntsToNumberString(int[] v)
        {
            string nu = "";
            for (int i = 0; i < v.Length; i++)
            {
                nu += NO_pattern[v[i]];
            }
            return nu;
        }
        /// <summary>
        /// 編號字符轉int數組
        /// </summary>
        /// <param name="nu"></param>
        /// <returns></returns>
        public static int[] NO_NumberStringToInts(string nu) 
        {
            int[] v = new int[nu.Length];
            for (int i = 0; i < nu.Length; i++)
            {
                v[i] = NO_patternList.IndexOf(nu[i]);
            }
            return v;
        }

        /// <summary>
        /// int數組下一個編號
        /// </summary>
        /// <param name="v"></param>
        /// <returns></returns>
        public static int[] NO_IntsNext(int[] v,int? index=null) 
        {
            int i = index ?? v.Length - 1;
            if (i < 0) 
            {
                //無法增加
                throw new Exception("CreateReportNumberLast 超出界限");
                return null;
            }
            if (v[i] < NO_pattern.Length - 1)
            {
                v[i]++;
                return v;
            }
            else
            {
                v[i] = 0;
                return NO_IntsNext(v, i - 1);
            }
        }
        #endregion
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章