随机大写字母不起作用
本文关键字:不起作用 大写字母 随机 | 更新日期: 2023-09-27 18:30:25
我想创建一个随机的"密码"生成器,生成不同字母的长度。您输入长度,它会使长度成为随机字符。我还希望一些随机字母大写。我有一个可变的 rndCap,它为 1 或 2。如果 rndCap == 2,if 会将其变成大写字母,否则,它什么也不做。答案是所有字符的组合。当我执行时,数字都是小写的。除了随机大写字符之外,一切都有效。
Random rnd = new Random();
string[] alphabet = new string[27];
alphabet[1] = "a";
alphabet[2] = "b";
alphabet[3] = "c";
alphabet[4] = "d";
alphabet[5] = "e";
alphabet[6] = "f";
alphabet[7] = "g";
alphabet[8] = "h";
alphabet[9] = "i";
alphabet[10] = "j";
alphabet[11] = "k";
alphabet[12] = "l";
alphabet[13] = "m";
alphabet[14] = "n";
alphabet[15] = "o";
alphabet[16] = "p";
alphabet[17] = "q";
alphabet[18] = "r";
alphabet[19] = "s";
alphabet[20] = "t";
alphabet[21] = "u";
alphabet[22] = "v";
alphabet[23] = "w";
alphabet[24] = "x";
alphabet[25] = "y";
alphabet[26] = "z";
string answer = "";
int length = Convert.ToInt32(lengthTextBox.Text);
int rndCap;
int rndLetter;
for (int i = 1; i <= length; i++)
{
rndCap = rnd.Next(1, 3);
rndLetter = rnd.Next(1, 27);
string tempMem = alphabet[rndLetter];
if (rndCap == 2)
{
tempMem.ToUpper();
}
answer = answer + tempMem;
}
passwordTextBox.Text = answer;
我很确定IF正在工作:)
但是,String.ToUpper()
不会将手头的字符串更改为大写,而是将其作为结果返回。您必须分配值。你想要的可能是这个:
tempMem = tempMem.ToUpper();
另外,要遵循的规则:始终牢记,编码、区域性和区域设置可以与当前区域设置不同。
即使在这种情况下,我们只使用"无害"的 ASCII 字符,但将其转换为大写字符串的实践:
- 使用 ToUpper(区域性信息)指定区域性 使用
- ToUpperInvariant() 使用"固定区域性"而不是默认区域性
正如 Jeppe 所指出的:在土耳其语区域设置中,i 大写为与 I 不同的字符 - 引入不必要的后果。
字符串immutable
所以你需要再次分配它
tempMem = tempMem.ToUpper();
调用 ToUpper,但不分配值:
tempMem = tempMem.ToUpper()
也许这段代码通常更优雅:
static void Main(string[] args)
{
Random cRandom = new Random(DateTime.Now.Millisecond);
string answer = "";
int length = Convert.ToInt32(6);
int rndCap;
int rndLetter;
for (int i = 1; i <= length; i++)
{
rndCap = cRandom.Next(1, 3);
rndLetter = cRandom.Next(0, 26);
char tempMem = (char)('a' + rndLetter);
string c2 = tempMem.ToString();
if (rndCap == 2)
{
c2 = tempMem.ToString().ToUpper();
}
answer = answer + c2;
}
Console.WriteLine(answer);
Console.ReadLine();
}
使用这个:
tempMem = tempMem.ToUpper();
由于ToUpper()
不会将大写字母设置为调用它的字符串,因此它会返回此字符串的副本,所有字母都大写。
ToUpper()
是一个返回大写字符串的方法,因此您需要将tempMem的值分配给该值:
tempMem = tempMem.ToUpper();
所有字符串操作都返回新字符串,并且不修改原始字符串,因为字符串是可模拟的。像这样修改它:tempMem = tempMem.ToUpper();
我认为有更简单的方法来实现你想要实现的目标。 看看这个代码;
var lowerchar = "abcdefghijklmnopqrstuvwxyz";
var upperchar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var numbers = "0123456789";
var random = new Random();
var result = new string(
Enumerable.Repeat(lowerchar, 3)
.Select(s => s[random.Next(s.Length)])
.ToArray());
result += new string(
Enumerable.Repeat(upperchar, 3)
.Select(s => s[random.Next(s.Length)])
.ToArray());
result += new string(
Enumerable.Repeat(numbers, 2)
.Select(s => s[random.Next(s.Length)])
.ToArray());
random = new Random();
string password = new string(result.ToCharArray().OrderBy(s => random.Next().ToArray());