我必须计算将第一个数字、第二个数字和操作作为参数的方法。
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)
这将需要我将我的数字转换为我不想要的字符串。
让我们以字典的形式为所有这些运算符提取模型:
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)
归档时间: |
|
查看次数: |
73 次 |
最近记录: |