从给出的备选字符或者字符区间中随机抽取字符组成所需要的字符串
内容:
1、 对于备选字符的问题,给出两种解决方案:
² 列出所有符合要求的字符组成字符串传入(Code1)
优点:可任意列出需要的字符,简洁明了
缺点:备选字符较多时一一罗列比较麻烦
² 给出一个字符区间(Code2)
优点:不需要一一罗列所有所需要的字符,方便快捷
缺点:不能满足对一些特殊字符的取舍,如需要选取的字符不属于一个区间内的情况
² 一个标准的字符文件(Code3)
优点:适合有大批量备选字符及多种特殊字符(各种不常见的字符、各种国家文字)
缺点:一般没有这种需求
2、 当抽取备选字符时,有以下两种操作方式:
² 通过Substring方法从给定的字符串中抽取字符,用StringBuilder拼出字符串返回(Code1)
² 通过Substring方法从给定的字符串中抽取字符,用+=拼出字符串返回
² 从数组中抽取字符,采用Char[]数组存储(Code4)
通过测试发现,在循环10000次以下时这三种方式的执行时间都可以忽略不计,当需要的字符长度达到100000时,用+拼接字符串的效率是很低的。以下是测试结果:(单位:秒)
codeCount | byte[] | += | StringBuilder |
10000 | 0.015625 | 0.28125 | 0.015625 |
100000 | 0.03125 | 36.921875 | 0.078125 |
1000000 | 0.171875 | —— | 0.609375 |
10000000 | 1.671875 | — | 5.953125 |
Code1:
/// <summary> /// 随机生成字符串 /// </summary> /// <param name="codeCount">字符串个数</param> /// <param name="baseString">备选字符组成的字符串</param> /// <returns>随机生成的字符串</returns> private string GenerateCodeFromString(int codeCount,string baseString) { int number; int length = baseString.Length; StringBuilder result = new StringBuilder(); System.Random random = new Random(); for(int i=0; i<codeCount; i++) { number = random.Next(length); result.Append(baseString.Substring(number,1)); } return result.ToString(); } |
Code2:
/// <summary> /// 随机生成字符串 /// </summary> /// <param name="codeCount">字符串个数</param> /// <param name="startCode">起始备选字符</param> /// <param name="endCode">结束备选字符</param> /// <returns>随机生成的字符串</returns> private string GenerateCodeFromRange(int codeCount,char startCode,char endCode) { int number; StringBuilder result = new StringBuilder(codeCount); int length = endCode - startCode + 1; char code = 'a'; System.Random random = new Random(); for(int i=0; i<codeCount; i++) { number = random.Next(length); code = (char)(startCode + (char)(number)); result.Append(code.ToString()); } return result.ToString(); } |
Code3:
/// <summary> /// 随机生成字符串 /// </summary> /// <param name="codeCount">字符串个数</param> /// <param name="fileName">标准的字符文件路径</param> /// <returns>随机生成的字符串</returns> private string GenerateCodeFromFile(int codeCount,string filePath) { int number; StreamReader stream = new StreamReader(filePath,System.Text.Encoding.Default); string s = stream.ReadToEnd(); int length = s.Length; StringBuilder result = new StringBuilder(codeCount); System.Random random = new Random(); for(int i=0; i<codeCount; i++) { number = random.Next(length); result.Append(s.Substring(number,1)); } return result.ToString(); } |
Code4:
/// <summary> /// 随机生成字符串 /// </summary> /// <param name="codeCount">字符串个数</param> /// <param name="chars">备选字符数组</param> /// <returns>随机生成的字符串</returns> private string GenerateCodeFromArray(int codeCount,char[] chars) { int number; char[] tempChars = new char[codeCount]; int length = chars.Length; System.Random random = new Random(); for(int i=0; i<codeCount; i++) { number = random.Next(length); tempChars[i] = chars[number]; } String result = new String(tempChars); return result.ToString(); } |
总结:
根据本函数的需求,需要随机抽取的字符串长度一般不会很大,所以无论采用哪种方式都可以接受。而根据情况给出多种接口形式供选择。