我如何检查字符串以查看是否所有字符都是整数,它的长度是否为 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
。在这种情况下,没有特定的有效值范围,因此您不应抛出表明存在的异常。如果有一个范围,那么您可以使用最小值和最大值来描述它。
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
。在这种情况下,没有特定的有效值范围,因此您不应抛出表明存在的异常。如果有一个范围,那么您可以使用最小值和最大值来描述它。