使用c#检查给定密码中0-9之间的至少一个数字



我试图循环遍历字符串中的每个字符,看看它们中是否有一个是0-9之间的数字。我得到了numCheck数组的索引越界错误,所以我知道我的问题是,当我尝试运行时,IDE希望txt_Pass.Text的长度=我的数组中的字符数。这是错误的,但我不确定如何修复。由于我不确定输入密码的长度,我需要使用向量吗?还是我完全疯了?

char[] numCheck = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
for (int i = 0; i < txt_Pass.Text.Length; i++)
{
if (txt_Pass.Text[i] != numCheck[i])
{
lbl_Form1_NumError.Visible = true;
}
lbl_Form1_NumError.Visible = false;
}

''

我认为最简单的解决方案结合了LINQ的Any和Char.IsDigit:

lbl_Form1_NumError.Visible = !txt_Pass.Text.Any(char.IsDigit);

对于任何超过十个字符的字符串,您都将遇到数组索引问题,因为您迭代了所有这些值,并使用该迭代索引查看numCheck数组因为它只有十个元素,所以访问第11个元素是不允许的。

一个简单的方法是使用两个嵌套循环来检查numCheck中的任何字符是否等于输入字符串的任何字符,类似于(这可以进行一些优化,但我没有担心,因为正如您在下面发现的,这完全没有必要(

bool hasADigit = false;
for (int i = 0; i < txt_Pass.Text.Length; i++) {
for (int j = 0; j < numCheck.Length; j++) {
if (txt_Pass.Text[i] == numCheck[j]) {
hasADigit = true;
}
}
}
// hasADigit is true if it, well, has a digit :-)

但是,如前所述,当C#提供了各种奇妙的库函数来为您完成繁重的任务时,这并不是真正必要的:

bool hasADigit = (txt_Pass.Text.indexOfAny(numCheck) != -1);

总之,您的整个代码块可以简化为:

char[] numCheck = {'0','1','2','3','4','5','6','7','8','9'};
lbl_Form1_NumError.Visible = (txt_Pass.Text.indexOfAny(numCheck) == -1);

LINQ来营救!

var numCheck = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
lbl_Form1_NumError.Visible = txt_Pass.Text.Any(c => numCheck.Contains(c));

Regex来营救!

using System.Text.RegularExpressions;
lbl_Form1_NumError.Visible = Regex.IsMatch(txt_Pass.Text, @"d")

最新更新