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 } }