3 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個贊
當(dāng)您嘗試letters.Append
時,您正在嘗試追加一個數(shù)組,這是不可能的,因?yàn)樗枪潭ㄩL度的。您可以使用List<String>
,但在這種特殊情況下,您可以使用專門的 .Net 類,稱為?StringBuilder。
由于字符串是不可變的,因此在需要對字符串執(zhí)行重復(fù)修改(例如向其附加值)的情況下,與創(chuàng)建新 String 對象相關(guān)的開銷可能會很高。這就是 StringBuilder 發(fā)揮作用的地方。
var?letters?=?new?StringBuilder();
現(xiàn)在,您可以附加字符而無需進(jìn)行 ToString() 轉(zhuǎn)換。
letters.Append(c)
最后,要從 StringBuilder 返回字符串,可以使用 ToString 方法。
return?letters.ToString();

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個贊
要添加到其他答案中,您的 if 也有問題,它們應(yīng)該是 if then else 或 switch如果您想保持正確的長度
小重構(gòu)
使用迭代器方法和開關(guān)
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貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個贊
對于生成隨機(jī)密碼來說,這看起來過于復(fù)雜。您可以使用下面的代碼并使用可選參數(shù)(如果它們不向函數(shù)傳遞任何內(nèi)容,則會生成長度為 15 的參數(shù))。
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 關(guān)注
- 214 瀏覽
添加回答
舉報(bào)