Как я могу l oop через строку, введенную пользователем в C#? - PullRequest
0 голосов
/ 27 апреля 2020

Теперь я пытаюсь проверить правильность формата этого идентификационного номера, введенного пользователем в этой программе. Теперь я знаю о матче, но я пытаюсь избежать этого. Я рассматривал foreach l oop, но идентификатор в формате XX-9999, и я не знаю, как проверить разные типы данных в таком виде l oop.

Я пытался использовать a для l oop, потому что я думал так: строка - это просто массив символов, поэтому я могу рассматривать ее как таковую. Но я думаю, что мой индекс проверяется вместо строковых символов.

В любом случае, вот мой метод:

public bool Validate_Employee_ID()
        {
            const int VALID_LENGTH = 7;  // Length of a valid string
            bool valid = true;   // Flag to indicate validity
            string strEmployeeID = txtEmployeeID.Text.Trim();  // get trimmed string from txtEmployeeID
            string[] stringEmpIDSplit = strEmployeeID.Split('-');

            if (strEmployeeID.Length == VALID_LENGTH)
            {
                // Check the first two characters in string.
                for (int i = 0; i <= strEmployeeID[1]; i++)
                {
                    // if the character is not a letter, valid equals false
                    if (!char.IsLetter(strEmployeeID[i]) == true)
                    {
                        MessageBox.Show("1) The employee ID must be in the following format: XX-9999.", "Entry Check", MessageBoxButton.OK, MessageBoxImage.Information);
                        txtEmployeeID.Focus();
                        // first two chars are not letters
                        valid = false;
                        return valid;
                    }
                }
                // Check the rest of the string to check the format.
                for (int j = strEmployeeID[3]; j <= strEmployeeID[6]; j++)
                {
                    // if the character is not a letter, valid equals false
                    if (!char.IsDigit(strEmployeeID[j]) == true)
                    {
                        MessageBox.Show("2) The employee ID must be in the following format: XX-9999.", "Entry Check", MessageBoxButton.OK, MessageBoxImage.Information);
                        txtEmployeeID.Focus();
                        // last 4 chars are not numbers
                        valid = false;
                        return valid;
                    }
                }
            }
            else valid = true;
            return valid;
        }

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

В этом случае вам на самом деле не нужен for l oop, поскольку у нас есть метод All из System.Linq, который может помочь нам проверить, соответствуют ли все символы в строке некоторым критериям:

const int validLength = 7;                   // Length of a valid string
var employeeID = txtEmployeeID.Text.Trim();  // Get trimmed string from txtEmployeeID
var empIDSplit = employeeID.Split('-');      // Split on the dash character

if (employeeID.Length != validLength ||      // Validate overall length
    empIDSplit.Length != 2 ||                // Validate number of parts after split
    empIDSplit[0].Length != 2 ||             // Validate first part length
    empIDSplit[1].Length != 4 ||             // Validate second part length
    !empIDSplit[0].All(char.IsLetter) ||     // Validate first part are letters
    !empIDSplit[1].All(char.IsDigit)         // Validate second part are digits
    )
{
    MessageBox.Show("1) The employee ID must be in the following format: XX-9999.",
        "Entry Check", MessageBoxButtons.OK, MessageBoxIcon.Information);
    txtEmployeeID.Focus();
    return false;
}

return true;

Если вы делаете , вам нужно использовать for l oop вместе с переменной для отслеживания результата проверки, вот способ сделать это. Мы начнем с предположения, что ввод действителен, а затем «быстро провалимся», если обнаружим, что это не так.

Когда мы находим недопустимые данные, мы устанавливаем переменную в false и затем пропускаем до конца метода, где отображаем наше сообщение (при необходимости) и возвращаем результат:

public bool Validate_Employee_ID()
{
    const int validLength = 7;                   // Length of a valid string
    var isValid = true;                          // Validation result
    var employeeID = txtEmployeeID.Text.Trim();  // Trimmed string from txtEmployeeID
    var empIDSplit = employeeID.Split('-');      // Split on the dash character

    if (employeeID.Length != validLength ||      // Validate overall length
        empIDSplit.Length != 2 ||                // Validate number of parts after split
        empIDSplit[0].Length != 2 ||             // Validate first part length
        empIDSplit[1].Length != 4)               // Validate second part length
    {
        isValid = false;
    }
    else
    {
        foreach (var chr in empIDSplit[0])
        {
            if (!char.IsLetter(chr))
            {
                isValid = false;
                break;         // "Fail fast" by exiting the loop at the first bad data
            }
        }

        // "Fail fast" by not checking the second part if the first one failed
        if (isValid)          
        {
            foreach (var chr in empIDSplit[1])
            {
                if (!char.IsDigit(chr))
                {
                    isValid = false;
                    break;     // "Fail fast" by exiting the loop at the first bad data
                }
            }
        }
    }

    // Display an error message if the input was invalid
    if (!isValid)
    {
        MessageBox.Show("1) The employee ID must be in the following format: XX-9999.",
            "Entry Check", MessageBoxButtons.OK, MessageBoxIcon.Information);
        txtEmployeeID.Focus();
    }

    return isValid;
}
0 голосов
/ 27 апреля 2020

Вы путаете свой индекс с вашими персонажами

// Check the rest of the string to check the format.
for (int j = 3; j <= 6; j++)
{
    // if the character is not a letter, valid equals false
    if (!char.IsDigit(strEmployeeID[j]))
    { 
       //snip
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...