为了账号安全,请及时绑定邮箱和手机立即绑定

如何将数组中的字符串连接成一个字符串并将其显示在控制台中?

如何将数组中的字符串连接成一个字符串并将其显示在控制台中?

C#
梦里花落0921 2023-12-17 16:59:32
我正在努力学习C#。我已经了解Python。我想用 C# 复制我用 Python 编写的一个简单的密码生成器程序。我的问题是我不知道如何将字符连接到一个字符串中以便我可以显示它。当我尝试显示它时,我只是在密码字符应有的位置出现空格。在Python中我可以做到这一点password = []#will have random items appended by generator codes = ''.join(password)#makes one stringprint(s)#printsnamespace 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);        }    }当我运行代码时,我调用Console.WriteLine(PasswordGenerator.Generate()) 但它不会打印我的密码。它只会打印一些逗号,并在密码中的字符应有的位置包含空格。我需要它来显示我的密码。我究竟做错了什么?我怎样才能让它显示我的密码?
查看完整描述

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


查看完整回答
反对 回复 2023-12-17
?
哆啦的时光机

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


查看完整回答
反对 回复 2023-12-17
?
胡说叔叔

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

}

查看完整回答
反对 回复 2023-12-17
  • 3 回答
  • 0 关注
  • 79 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信