【问题标题】:C# use string variable as a arithmetic operatorC#使用字符串变量作为算术运算符
【发布时间】:2016-02-14 20:13:23
【问题描述】:

我是 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 = "+";
}

【问题讨论】:

  • 有一个提供通用运算符作为方法的实用程序。 yoda.arachsys.com/csharp/genericoperators.html 。希望这将帮助您找到一个好的解决方案。也可以使用枚举而不是字符串来定义所有操作。
  • 我删除了我之前的评论,因为我需要重新措辞,因为它不清楚。有很多方法可以解决这个问题。但是,就实际将其直接转换为运算符而言,答案是“否”。 This Post 真的可以帮到你。它显示了两种可能的方法,都具有相关的结果。带有逻辑开关的自定义类和泛型是处理它的好方法。

标签: c# c#-4.0


【解决方案1】:

您可以只使用 ifswitch 运算符并为每个 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
【解决方案2】:

不,我认为你不能。检查您在 btn_name 中的值,如果它是“减号”,则执行算术运算

if (btn_name == "minus")
{
    second = first - second;
}

【讨论】:

  • 是的,我也在做同样的事情,但是如果我有 30 个操作,那么如果其他阻塞则意味着 30 个。
【解决方案3】:

我认为最好的方法是有一个字典,其中键作为操作的名称,值作为委托, 例如

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)一样简单

当然,使用枚举而不是字符串更有意义,但你明白了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 2021-05-17
    • 2019-03-24
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多