проверка по крайней мере 1 числа от 0 до 9 в данном пароле с использованием c# - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь перебрать каждый символ в строке, чтобы увидеть, является ли какой-либо из них числом от 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;
        }

'' '

Ответы [ 3 ]

2 голосов
/ 19 февраля 2020

Я думаю, что самое простое решение объединяет LINQ Любой и Char.IsDigit:

lbl_Form1_NumError.Visible = !txt_Pass.Text.Any(char.IsDigit);
0 голосов
/ 19 февраля 2020

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")
0 голосов
/ 19 февраля 2020

Вы получите проблему с индексом массива для любой строки, содержащей более десяти символов, так как вы перебираете все эти значения и используете этот индекс итерации для просмотра 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);
...