如何将数组中的字符串合并为一个字符串并在控制台中显示?



我正在尝试学习C#。我已经知道Python了。我想用 C# 复制我用 Python 编写的一个简单的密码生成器程序。我的问题是我不知道如何将字符连接成一个字符串,以便我可以显示它。当我尝试显示它时,我只是在密码中的字符应该在的地方得到空格。

在Python中我可以做到这一点

password = []#will have random items appended by generator code
s = ''.join(password)#makes one string
print(s)#prints
namespace learning
{
public static class PasswordGenerator
{
private static string Letters = "abcdefghijklmnopqrstuvwxyz";
private static string Numbers = "1234567890";
private static string Symbols = "!@#$%^&*()";
public static string Generate()
{
string[] letters = new string[10];
string[] choice = { "letter", "number", "symbol" };
string[] UL = { "uper", "lower" };
string get;
char c;
for (int i = 0; i <= 9; i++)
{
get = Rand.RandString(choice);
if (get == "letter")
{
c = Rand.RandChar(Letters);
get = Rand.RandString(UL);
if (get == "uper")
{
c = char.ToUpper(c);
letters.Append(c.ToString());
}
else
{
letters.Append(c.ToString());
}
}
if (get == "number")
{
c = Rand.RandChar(Numbers);
letters.Append(c.ToString());
}
if (get == "symbol")
{
c = Rand.RandChar(Symbols);
letters.Append(c.ToString());
}
}
return String.Join(",", letters);
}
}
public class Rand
{
private static Random Generator = new Random();
public static Char RandChar(string items) //Choose a random char from string
{
int myIndex = Generator.Next(items.Length);
char l = items[myIndex];
return l;
}
public static string RandString(string[] items)//Choose a random string from a list
{
int myIndex = Generator.Next(items.Length);
string s = items[myIndex];
return s;
}
}
}

当我运行代码时,我调用Console.WriteLine(PasswordGenerator.Generate())但它不会打印我的密码。它只会打印一些逗号,并在密码中的字符应该在的地方有空格。我需要它来显示我的密码。我做错了什么?如何让它显示我的密码?

当你尝试letters.Append时,你试图附加一个数组,这是不可能的,因为它是固定长度的。您可以使用List<String>,但在这种特殊情况下,您可以使用专门的.Net类,称为StringBuilder。

由于字符串是不可变的,因此在需要对字符串执行重复修改(例如向其追加值(的情况下,与创建新的 String 对象相关的开销可能很高。这就是StringBuilder的用武之地。

var letters = new StringBuilder();

现在,您可以在不进行 ToString(( 转换的情况下附加字符。

letters.Append(c)

最后,若要从 StringBuilder 返回字符串,可以使用 ToString 方法。

return letters.ToString();

为了补充其他答案,您的if也有问题,如果您想保持长度正确,它们应该是if then elseswitch

小型重构

使用迭代器方法和开关

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));

对于生成随机密码来说,这看起来过于复杂。 您可以使用可选参数使用下面的代码(如果它们不向函数传递任何内容,则它会生成长度为 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);
}

发现这个快速的解决方案只是谷歌搜索这个网址:https://www.c-sharpcorner.com/article/how-to-generate-a-random-password-in-c-sharp-and-net-core/

相关内容

最新更新