我是C#的新人,我试图创建一个计算器。 我将算术运算符存储在字符串中是否有任何方法可以使用运算符来求解方程式?
我的代码:
else if (btn_name == "plus" || btn_name == "minus")
{
bol = true;
try
{
if (solve == "")
{
string num1 = Screen.Text;
first = float.Parse(num1);
second = first + second;
Screen.Text = second.ToString();
Screen_upper.Text = upper_text + text + " + ";
}
else
{
second = first (**#I want to use the operator here#**) second;
}
}
catch
{
Screen.Text = second.ToString();
Screen_upper.Text = upper_text + text + " + ";
}
solve = "+";
}
答案 0 :(得分:3)
您可以只使用if
或switch
运算符,并为每个else/case
块分支逻辑:
switch(btn_name)
{
case "plus":
second = first + minus;
break;
case "minus":
second = first - minus;
break;
case "div":
second = first / minus;
break;
}
但是阅读此代码非常困难。替代解决方案是使用预定义的运算符库。实现它的一种方法是使用简单的Dictionary<string, Func<float, float, float>>
和delegate:
// it's class member, not a local variable
Dictionary<string, Func<float, float, float>> operators = new Dictionary<string, Func<float, float, float>>();
operators.Add("plus", (first, second) => first + second);
operators.Add("minus", (first, second) => first - second);
operators.Add("div", (first, second) => first / second);
现在您可以使用下一个代码(完成您的示例):
if (solve == "")
{
string num1 = Screen.Text;
first = float.Parse(num1);
second = first + second;
Screen.Text = second.ToString();
Screen_upper.Text = upper_text + text + " + ";
}
else
{
second = operators[btn_name](first, second);
}
它可能会更好,因为您将拆分运算符初始化和使用并使代码位清晰。
另一个场景是为每个按钮设置不同的事件处理程序,并在处理程序中实现必要的逻辑。但是,您需要在合并重复部分(数字解析和更新结果)之前重构代码,并且您的最终解决方案与基于字典的解决方案几乎相同。
答案 1 :(得分:1)
不,我认为你不能。检查btn_name中的值以及它是否&#34;减去&#34;执行算术运算
if (btn_name == "minus")
{
second = first - second;
}
答案 2 :(得分:1)
我认为最好的方法是使用一个字典,其中键作为操作的名称,值作为委托, 例如
var dict = new Dictionary<string, Func<int, int, int>> () {
{ "add", AddFunc },
{ "minus", MinusFunc }
};
public static int AddFunc(int arg1, int arg2)
{
return arg1 + arg2;
}
public static int MinusFunc(int arg1, int arg2)
{
return arg1 - arg2;
}
调用方法就像dict["minus"](arg1,arg2)
当然,使用Enums而不是字符串更有意义,但你明白了。