【问题标题】:How to generate a string with less than / more than length如何生成长度小于/大于长度的字符串
【发布时间】:2020-05-03 09:11:50
【问题描述】:

我希望允许用户选择确切的长度,或者少于/多于 count 个要生成的字符(在密码生成器中)。

例如我做过:

// the longivity of the generated string  
var stringChars = new char[int.Parse(TextBox2.Text)];
var random = new Random();

for (int i = 0; i < stringChars.Length; i++)
{
  // abc has been declared before, it is simply ABCD... for character generation
  stringChars[i] = abc[random.Next(abc.Length)];
}

var finalString = new String(stringChars);
// this is the result box
TextBox1.Text = finalString;

现在我的问题是如果用户输入例如。 10 并且想要生成的字符串少于 10 个字符,我该怎么办?

【问题讨论】:

  • 如果您允许您的用户选择字符数,为什么他想要的比他选择的要少? PS:不要那样使用Random(),这不是一个好习惯。见:stackoverflow.com/a/19271062/12624874
  • @PhilippeB。您的链接是关于 Java 的问题,而不是 C#。
  • @Helios Lucifer 你能举个例子吗?你的问题不是很清楚...
  • @JohnathanBarclay 你是对的,我搞混了,它是固定的:)

标签: c# string for-loop passwords


【解决方案1】:

你可以做这样的事情(借助 Linq 的力量):

public string GeneratePassword(string abc, int minLenght, int maxLenght)
{
    var random = new Random();
    var chars = Enumerable
        .Range(0, random.Next(minLenght, maxLenght + 1)) // Generate a range between the min and max.
        .Select(x => abc[random.Next(abc.Length)])       // Select a random character from the abc.
        .ToList();

    // Concatenate the string.
    return string.Join(string.Empty, chars);
}

你必须使用System.Linq

用法:

var input = 10;
var abc = "abcde";
var maxPasswordLength = 100;
var minPasswordLength = 1;

// More than the input.
GeneratePassword(abc, input + 1, maxPasswordLength);
// Less than the input.
GeneratePassword(abc, minPasswordLength, input - 1);
// Exact length.
GeneratePassword(abc, input, input);

【讨论】:

    【解决方案2】:
    public class Program
    {
        private const int MAX_LENGTH = 50;
        static void Main(string[] args)
        {
            var less = GeneratedLessThan(12);
            var more = GeneratedMoreThan(12);
            Console.WriteLine($"Less Than : {less} ({less.Length})");
            Console.WriteLine($"More Than : {more} ({more.Length})");
            Console.ReadLine();
        }
    
        static char[] ABC()
        {
            List<char> list = new List<char>();
            for (char i = 'A'; i <= 'Z'; i++)
            {
                list.Add(i);
            }
            return list.ToArray();
        }
    
        static string GeneratedLessThan(int max) => GeneratedString(0, max);
        static string GeneratedMoreThan(int min) => GeneratedString(min, MAX_LENGTH);
        static string GeneratedString(int min, int max)
        {
            StringBuilder builder = new StringBuilder();
            var abc = ABC();
            var rnd = new Random();
            for (int i = 0; i <= rnd.Next(min, max); i++)
            {
                builder.Append(abc[rnd.Next(abc.Length)]);
            }
    
            return builder.ToString();
        }
    }
    

    也许你不需要ABC函数。

    输出:

    Less Than : IORS (4)
    More Than : BSVPFZVQRWZTSPYDI (17)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 2019-08-04
      相关资源
      最近更新 更多