【发布时间】:2019-11-17 15:58:47
【问题描述】:
我正在尝试学习 c#,目前我正在尝试制作一个计算器,您可以在其中输入任意数量的字符,它会显示最终结果...
对于我的示例,我将使用 List<string> Statement = {"12", "/", "4", "*", "3"}
string numbers = "0123456789";
for (int i = 0; i < Statement.Count; i++)
{
if (!numbers.Contains(Statement[i][0]))
{
Statement[i] = Convert.ToString(Operations.Compute(Convert.ToInt32(Statement[i - 1]), Convert.ToInt32(Statement[i + 1]), Statement[i]));
Statement.RemoveAt(i - 1);
Statement.RemoveAt(i + 1);
i--;
}
}
运算计算:
class Operations
{
public static float Compute(float num1, float num2, string OpType)
{
if(OpType == "+") { return num1 + num2; }
if(OpType == "-") { return num1 - num2; }
if(OpType == "*") { return num1 * num2; }
if(OpType == "/") { return num1 / num2; }
return 0;
}
}
当我运行程序并使用简单的 foreach 循环列出来自 Statement 的所有元素时,我希望它返回 9(因为 12/4*3 = 9)。
相反,它列出了以下三个数字:3、4、3
它似乎总是计算前两个数字,然后列出其余的数字。
【问题讨论】:
-
如果您调用
RemoveAt,那么您的i不再是之前值的索引。这意味着您的第二个RemoveAt删除了其他内容 -
您以非常复杂的方式进行操作。也许
Stack<>或Queue<>可以帮助您。那么你就不需要for-loop。 -
@Neijwiert 我知道 RemoveAt 会以某种方式影响我,没想到那个。谢谢!
-
第一次执行
Statement.RemoveAt(i + 1);,i 是1,所以你删除了item[2],当时是"*"。 -
@oerkelens 是的,我刚刚将 RemoveAt 中的 i + 1 更改为 i 并且它可以工作。谢谢!