使自定义计算方法采用任何通用运算符

Nig*_*ape -1 c# math

我必须计算将第一个数字、第二个数字和操作作为参数的方法。

public static double Calculate(double firstNumber, double secondNumber, string operation)
{
    var result = default(double);
    switch (operation)
    {
        case "+":
            result = firstNumber + secondNumber;
            break;
        case "-":
            result = firstNumber - secondNumber;
            break;
        case "*":
            result = firstNumber * secondNumber;
            break;
        case "/":
            result = firstNumber / secondNumber;
            break;
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

现在我正在使用一个开关。当操作是“+”时,我添加数字。

如何让计算方法将任何算术运算符作为参数,而不必为其添加特定案例?

我的想法最终是这样的:

public static string Calculate(double firstNumber, double secondNumber, string operation)
{
     return firstNumber operation secondNumber;
}
Run Code Online (Sandbox Code Playgroud)

我从这个问题知道有一种方法,例如使用

new DataTable().Compute("1 + 2 * 7", null)
Run Code Online (Sandbox Code Playgroud)

这将需要我将我的数字转换为我不想要的字符串。

Dmi*_*nko 5

让我们以字典的形式为所有这些运算符提取模型

 private static Dictionary<string, Func<double, double, double>> s_Operators = new
   Dictionary<string, Func<double, double, double>>() {
     { "+", (x, y) => x + y },
     { "-", (x, y) => x - y },
     { "*", (x, y) => x * y },
     { "/", (x, y) => x / y },

     //TODO: Add new operations if you want, e.g.
     // { "^", (x, y) => Math.Pow(x, y) }, 
   };
Run Code Online (Sandbox Code Playgroud)

然后您可以轻松实现Calculate

public static double Calculate(double firstNumber, double secondNumber, string operation) 
{
  return s_Operators.TryGetValue(operation, out var func)
    ? func(firstNumber, secondNumber)
    : throw new ArgumentException($"Unknown {operation} operation", nameof(operation));
}
Run Code Online (Sandbox Code Playgroud)

请注意,您必须Dispose DataTable举例,这就是为什么在帮助下DataTable进行计算将是这样的:

private static double TableCompute(string formula) {
  using (DataTable table = new DataTable()) {
    return Convert.ToDouble(table.Compute(formula, null));
  }
}
Run Code Online (Sandbox Code Playgroud)