3 回答
TA贡献1824条经验 获得超8个赞
当您尝试letters.Append
时,您正在尝试追加一个数组,这是不可能的,因为它是固定长度的。您可以使用List<String>
,但在这种特殊情况下,您可以使用专门的 .Net 类,称为 StringBuilder。
由于字符串是不可变的,因此在需要对字符串执行重复修改(例如向其附加值)的情况下,与创建新 String 对象相关的开销可能会很高。这就是 StringBuilder 发挥作用的地方。
var letters = new StringBuilder();
现在,您可以附加字符而无需进行 ToString() 转换。
letters.Append(c)
最后,要从 StringBuilder 返回字符串,可以使用 ToString 方法。
return letters.ToString();
TA贡献1779条经验 获得超6个赞
要添加到其他答案中,您的 if 也有问题,它们应该是 if then else 或 switch如果您想保持正确的长度
小重构
使用迭代器方法和开关
public static IEnumerable<char> Generate(int size, string[] choice, string[] ul)
{
for (var i = 0; i < size; i++)
{
switch (Rand.RandString(choice))
{
case "letter":
if (Rand.RandString(ul) == "uper")
yield return char.ToUpper(Rand.RandChar(Letters));
else
yield return Rand.RandChar(Letters);
break;
case "number":
yield return Rand.RandChar(Numbers);
break;
case "symbol":
yield return Rand.RandChar(Symbols);
break;
}
}
}
用法
string[] choice = { "letter", "number", "symbol" };
string[] UL = { "uper", "lower" };
Console.WriteLine(string.Concat(Generate(10, choice, UL)));
演示在这里
https://dotnetfiddle.net/qSHimm
或者另一种方式
public class Rand
{
private static Random Generator = new Random();
public static T Get<T>(T[] items) //Choose a random char from string
=> items[Generator.Next(items.Length)];
}
private static string Letters = "abcdefghijklmnopqrstuvwxyz";
private static string Numbers = "1234567890";
private static string Symbols = "!@#$%^&*()";
public enum Options
{
Upper,Lower, Numbers, Symbols
}
public static IEnumerable<char> Generate(int size, params Options[] options)
{
for (var i = 0; i < size; i++)
{
switch (Rand.Get(options))
{
case Options.Upper: yield return char.ToUpper(Rand.Get(Letters.ToCharArray())); break;
case Options.Lower: yield return Rand.Get(Letters.ToCharArray()); break;
case Options.Numbers: yield return Rand.Get(Numbers.ToCharArray()); break;
case Options.Symbols: yield return Rand.Get(Symbols.ToCharArray());break;
}
}
}
用法
Console.WriteLine(string.Concat(Generate(10, Options.Upper,Options.Numbers)));
输出
R0P76UYO1D
或者另一种方式
public static string Generate(int size, params Options[] options)
=> string.Concat(Enumerable.Repeat(0,size).Select(x => GetChar(options)));
private static char GetChar(params Options[] options)
{
switch (Rand.Get(options))
{
case Options.Upper: return char.ToUpper(Rand.Get(Letters.ToCharArray())); ;
case Options.Lower: return Rand.Get(Letters.ToCharArray());
case Options.Numbers: return Rand.Get(Numbers.ToCharArray());
case Options.Symbols: return Rand.Get(Symbols.ToCharArray());
default: throw new ArgumentOutOfRangeException();
}
}
用法
Console.WriteLine(Generate(10, Options.Upper,Options.Numbers));
TA贡献1804条经验 获得超8个赞
对于生成随机密码来说,这看起来过于复杂。您可以使用下面的代码并使用可选参数(如果它们不向函数传递任何内容,则会生成长度为 15 的参数)。
private static string CreateRandomPassword(int length = 15)
{
string validChars = "ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*?_-";
Random random = new Random();
// Select one random character at a time from the string
// and create an array of chars
char[] chars = new char[length];
for (int i = 0; i < length; i++)
{
chars[i] = validChars[random.Next(0, validChars.Length)];
}
return new string(chars);
}
- 3 回答
- 0 关注
- 155 浏览
添加回答
举报