c#随机字符串,带字母,然后是数字x长度

时间:2014-05-27 20:40:30

标签: c#

我希望生成一个必须采用以下格式的随机字符串:

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

2 个答案:

答案 0 :(得分:6)

使用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();
}

使用计数器mod 2可以获得交替行为。一段时间也可以,但for语义在这里更有意义。

答案 1 :(得分:-1)

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

我发现更清楚地分别生成数字或字母,因此您可以根据需要组合它们。

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

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