我希望生成一个必须采用以下格式的随机字符串:
[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());
}
答案 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();
}