c# - 如何创建具有一定数量数字的随机字符串?
问题描述
我想创建一个函数,允许我生成具有某些条件的随机字符串,例如最多 2 位数字等。
到目前为止,我已经找到了这个,但我不知道如何使它最多两位数:
public static string Generate(int size)
{
const string chars = "abcdefghijklmnopqrstuvwxzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var random = new Random();
return new string(Enumerable.Repeat(chars, size).Select(s => s[random.Next(s.Length)]).ToArray());
}
解决方案
您可以对类别“digit”、“lowerCase”和“upperCase”进行硬编码,并跟踪您已经添加到生成的字符串中的数量:
public static string Generate(int size, int? maxDigits = null, int? maxLowerCase = null, int? maxUpperCase= null)
{
if (maxDigits.HasValue && maxLowerCase.HasValue && maxUpperCase.HasValue && maxDigits + maxLowerCase + maxUpperCase< size)
{
throw new ArgumentOutOfRangeException($"Can't generate a string of length {size} with the given limits");
}
const string chars = "abcdefghijklmnopqrstuvwxzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var passwordBuilder = new StringBuilder();
var random = new Random();
int digitCount = 0, lowerCaseCount = 0, upperCaseCount = 0;
while (passwordBuilder.Length < size)
{
var nextCharacter = chars[random.Next(chars.Length)];
if (char.IsDigit(nextCharacter) && (!maxDigits.HasValue || digitCount < maxDigits))
{
passwordBuilder.Append(nextCharacter);
digitCount++;
}
if (char.IsLower(nextCharacter) && (!maxLowerCase.HasValue || lowerCaseCount < maxLowerCase))
{
passwordBuilder.Append(nextCharacter);
lowerCaseCount++;
}
if (char.IsUpper(nextCharacter) && (!maxUpperCase.HasValue || upperCaseCount < maxUpperCase))
{
passwordBuilder.Append(nextCharacter);
upperCaseCount++;
}
}
return passwordBuilder.ToString();
}
像这样使用:
var password = Generate(10, maxDigits: 2);
推荐阅读
- java - 根据 Eclipse 中通过 JAXB 和 XSD 构建选项生成的 xsd 文件验证 xml
- ionic3 - 如何在 ionic-v3 中获取 Google 博客文章
- reinforcement-learning - 强化学习中的小批量
- asp.net-core - 将 SignalR 添加到现有 IdentityServer4 授权
- qt - qt-creator-4.8.0 字体模糊问题
- python - 将原始字节转换为图像
- aws-api-gateway - AWS API Gateway - 我可以在不中断客户端的情况下更改自定义域名的 base_mapping 吗?
- sql - 如何获取过去 12 个月的数据并在 HIVE 中按月拆分?
- java - 在 Java 中使用 HtmlUnit 单击 Html 按钮
- python - 如何在 Python 中启动子进程,以便它使用 pty 而不是管道将 I/O 连接到父进程?