我如何检查字符串以查看是否所有字符都是整数,它的长度是否为 8 个字符并为每个字符抛出一个参数?

How do i check string to see if all characters are integers, that it is 8 characters in length and throw an argument for each?

Class student 和 main 仅供参考。在 try catch 块中有两个单独的 s1.SNum = "string" 应该每个抛出一个单独的参数但都抛出每次都一样,我搞不懂。

class Student
    {
       public string FirstName { get; private set; }
       public string LastName { get; private set; }
       public Date BirthDate { get; private set; }

       public Date catalog;
       public string sNum;
     }

这是我遇到问题的代码。我想要有两组为 sNum 抛出异常。一种是没有所有数字,另一种是长度不是八。

public string SNum
        {
            get
            {
                return sNum;
            }

            set
            {
            foreach (char c in sNum)
            {
                int count = 0;
                char charToCount = ',';
                bool result = (SNum.All(Char.IsDigit));

                if (result == false)
                {
                    throw new ArgumentOutOfRangeException(nameof(SNum), value,
                    $"{nameof(SNum)} characters are not all integers.");
                }

                if (c == charToCount)
                {
                    count++;
                }
                else if (count != 8)       BOTH WILL THROW THIS ARGUMENT RIGHT NOW
                {
                    throw new ArgumentOutOfRangeException(nameof(SNum), value,
                    $"{nameof(SNum)} length is not eight.");
                }
            }
        }

和 Main Class 用于引用 try catch..即使我正在检查任何字母 s1.SNum = "158945K9"; 仍然会抛出与 s1.SNum = "1234567";[=15 相同的异常=]

            // attempt to assign invalud sNum length
            try
            {
                s1.SNum = "1234567";  
            }
            catch (ArgumentOutOfRangeException ex)
            {
                Console.WriteLine($"{ex.Message}\n");
            }

            // attempt to assign invalud sNum character
            try
            {
                s1.SNum = "158945K9";
            }
            catch (ArgumentOutOfRangeException ex)
            {
                Console.WriteLine($"{ex.Message}\n");
            }

如果您只关心值全为数字且长度为 8 个字符,那么实现比您拥有的要简单得多:

set
{
    if (value.Any(ch => !char.IsDigit(ch))
        throw new ArgumentException("All characters must be digits.");

    if (value.Length != 8)
        throw new ArgumentException("Value must be eight characters in length.");

    sNum = value;
}

虽然似乎还有更多内容,但您还没有解释其余部分。如果你想允许逗号并且它们不包含在长度计算中,那么它会变成这样:

set
{
    if (value.Any(ch => ch != ',' && !char.IsDigit(ch))
        throw new ArgumentException("All characters must be digits or commas.");

    if (value.Count(ch => ch != ',') != 8)
        throw new ArgumentException("Value must contain eight digits.");

    sNum = value;
}

您可能更喜欢使用 All 而不是 Any,这在两种情况下都适用,并且避免了第二个代码片段中的双重否定,但仍然需要完全相同的字符数在每种情况下:

set
{
    if (!value.All(ch => char.IsDigit(ch))
        throw new ArgumentException("All characters must be digits.");

    if (value.Length != 8)
        throw new ArgumentException("Value must be eight characters in length.");

    sNum = value;
}

和:

set
{
    if (!value.All(ch => ch == ',' && char.IsDigit(ch))
        throw new ArgumentException("All characters must be digits or commas.");

    if (value.Count(ch => ch != ',') != 8)
        throw new ArgumentException("Value must contain eight digits.");

    sNum = value;
}

使用 Any 还可以与其他 if 语句保持更多的一致性,但这是一个非常小的事情。

另请注意,我抛出的是 ArgumentException 而不是 ArgumentOutOfRangeException。在这种情况下,没有特定的有效值范围,因此您不应抛出表明存在的异常。如果有一个范围,那么您可以使用最小值和最大值来描述它。