我似乎在我的代码的这两个部分中误导或误用了代码。我理解是什么导致程序在调试时给我IsOperator错误消息。奇怪的是,+运算符可以工作,但其他运算符都没有。
public bool IsValidData()
{
return
IsPresent(txtOperand1, "Operand 1") &&
IsDecimal(txtOperand1, "Operand 1") &&
IsWithinRange(txtOperand1, "Operand 1", 0, 1000000) &&
IsPresent(txtOperator, "Operator") &&
IsOperator(txtOperator, "+, -, *, /") &&
IsPresent(txtOperand2, "Operand 2") &&
IsDecimal(txtOperand2, "Operand 2") &&
IsWithinRange(txtOperand2, "Operand 2", 0, 1000000);
}
public bool IsOperator(TextBox textBox, string operators)
{
try
{
foreach (string s in operators.Split(new char[] { ',' }))
{
if (textBox.Text.Trim() == s)
return true;
else
throw new ArgumentException("The operator must be a valid operator: +,-, *, /", "name");
}
return true;
}
catch (ArgumentException ex)
{
MessageBox.Show(ex.Message);
txtOperator.Focus();
return false;
}
}
答案 0 :(得分:5)
您的运算符列表包含空格:
"+, -, *, /"
这会导致意外行为。尝试:
"+,-,*,/"
或者,防御性地修剪s
变量......
您正在修剪文本输入,但不是与其进行比较的运算符,因此如果if (textBox.Text.Trim() == s)
包含空格,则s
将永远不会为真。
此外,您正在根据运算符列表检查文本 - 如果它与第一个运算符不匹配也会失败,因为只要该比较失败,就会抛出Argument Exception
例如,您的文本框包含*
,您的第一个运算符为+
:
if ("*" == "+") // FAIL
我的建议编辑 - 只有在您全部检查后才会失败:
foreach (string s in operators.Split(new char[] { ',' }))
{
if (textBox.Text.Trim() == s.Trim()) {
return true;
}
}
MessageBox.Show("The operator must be a valid operator: " + operators);
txtOperator.Focus();
return false;
答案 1 :(得分:0)
您可以使用Array.IndexOf执行此操作。
public bool IsOperator(TextBox textBox, string operators)
{
string[] operatorArray = operators.Split(new char[] { ',' });
if (Array.IndexOf(operatorArray, textBox.Text.Trim()) >= 0) {
return true;
} else {
MessageBox.Show("The operator must be a valid operator: +,-, *, /");
textBox.Focus();
return false;
}
}
注意:运营商必须像" +, - ,*,/"嵌入在运算符字符串中的空格可能会破坏此功能。