c#随机字符串与字母和数字x的长度

本文关键字:数字 随机 字符串 | 更新日期: 2023-09-27 18:05:39

我希望生成一个随机字符串,必须在以下格式:

[LETTER][NUMBER][LETTER][NUMBER]等指定长度

到目前为止,我有一个随机字符串生成器,删除了一些我不想要的字符,任何关于如何实现这样一个字符串的建议将非常感激。

 public static string GenerateRandomString(int length)
 {
    const string chars = "ABCEFGHJKPQRSTXYZ23456789";            
    return new string(Enumerable.Repeat(chars, length)
                                .Select(s =>s[RandomHelper.StaticRandom.Instance.Next(s.Length)])
                                .ToArray());
 }

c#随机字符串与字母和数字x的长度

使用for循环似乎会更容易:

public static string GenerateRandomReference(int length)
{
    const string chars = "ABCEFGHJKPQRSTXYZ"; 
    const string ints = "23456789"; 
    var returnString = new StringBuilder(length);
    for (int currentIndex = 0; currentIndex < length; currentIndex++)
    {
        if (currentIndex % 2 == 0)
            //Random letter
            returnString.Append(chars[RandomHelper.StaticRandom.Instance.Next(chars.Length)]);
        else
            //Random number
            returnString.Append(ints[RandomHelper.StaticRandom.Instance.Next(ints.Length)]);
    }
    return returnString.ToString();
}

使用counter mod 2可以得到交替的行为。A while也可以,但是for语义在这里更有意义。

通过保留可用字符的限制,您可以执行以下操作:

我发现单独生成数字或字母更清楚,因此您可以根据自己的喜好组合它们。

对于生成本身,可以使用简单的while循环或for循环。

 private static char GenerateRandomLetter()
 {
    const string chars = "ABCEFGHJKPQRSTXYZ";
    Random rnd = new Random(); // you can avoid this allocation, put it class member            
    return chars[rnd.Next(0, chars.Length - 1)];
 }
 private static int GenerateRandomNumber()
 {
   Random rnd = new Random(); // you can avoid this allocation, put it class member
   return rnd.Next(2, 9);
 }
private static string GenerateKey(int length)
{
    // use a StringBuilder if you have a lot of concatenations
    var sb  = new StringBuilder();
    bool doLetter = true;
    for(int i = 0; i < length; ++i)
     {
         sb .Append((doLetter ?  GenerateRandomLetter().ToString() : GenerateRandomNumber().ToString()));
         doLetter = !doLetter;
     }
    return sb.ToString();
}