如何将操作符作为参数传递给函数,我在C#中执行计算器

时间:2012-07-23 21:36:26

标签: c#-4.0 arguments calculator

 public int MainOperationSimplifeid(char operatoru)
    {
        if (beforeoperation == 2)
        {
            a2 = Convert.ToInt32(textBox1.Text);
            textBox1.Text = "";
            result = a1 operatoru a2;
            //   textBox1.Text = Convert.ToString(result);
            a1 = 0;
            a2 = 0;
        }
        beforeoperation++;
        return result;
    }
  

a1,a2 - 代表程序中的两个数字,结果是>操作的答案

我正在考虑使用一个单个字符或其他类似的参数来减少我在程序中使用的所有运算符

但是我不能将+,*替换为两个整数之间的char。 :(

你们可以请求帮助哪个inbult函数或参数可以将我的所有运算符替换为单个变量,以便我可以将其作为我的参数传递。

感谢您回答我的问题:)

2 个答案:

答案 0 :(得分:1)

这种事情可以通过代表来完成。内置委托类型Func<T1, T2, T3>表示接受两个参数并返回结果的代码。

public int MainOperationSimplifeid(Func<int, int, int> operatoru)
{
    if (beforeoperation == 2)
    {
        a2 = Convert.ToInt32(textBox1.Text);
        textBox1.Text = "";
        result = operatoru(a1, a2);
        //   textBox1.Text = Convert.ToString(result);
        a1 = 0;
        a2 = 0;
    }
    beforeoperation++;
    return result;
}

然后你可以用lambda调用方法:

var addResult = MakeOperationSimplifeid((x, y) => x + y);
var multResult = MakeOperationSimplifeid((x, y) => x * y);

答案 1 :(得分:-1)

我认为你无法做到这一点,因为编译器需要运算符来编译程序。所以,正如我所看到的,解决方案可能是enum,像这样:

Enum Operator {
     Addition, Substraction, Multiplication, Division 
};

public double MainOperationSimplified(Operator operatoru)
{
    if (beforeoperation == 2)
    {
        a2 = Convert.ToInt32(textBox1.Text);
        textBox1.Text = "";

        switch (operatoru) {
            case Addition:
               result = a1 + a2;
               break;
            case Substraction:
               result = a1 - a2;
               break;
            case Multiplication:
               result = a1 * a2;
               break;
            case Division:
               result = a1 / a2;
               break;
            default:
               result = 0;
               break;
        }

        a1 = 0;
        a2 = 0;
    }
    beforeoperation++;
    return result;
}