Сделать пользовательский метод расчета принять любой оператор c - PullRequest
0 голосов
/ 11 марта 2020

Я должен рассчитать метод, который принимает в качестве параметров первое число, второе число и операция .

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;
}

справа Теперь я использую переключатель. Когда операция представляет собой «+», я добавляю числа.

Как можно заставить метод вычисления принимать любой арифметический оператор c в качестве параметра без необходимости добавлять конкретный случай c для это?

Моя идея заключается в том, что в конце концов это будет выглядеть так:

public static string Calculate(double firstNumber, double secondNumber, string operation)
{
     return firstNumber operation secondNumber;
}

Я знаю из этого вопроса , что есть способ, например, используя

new DataTable().Compute("1 + 2 * 7", null)

, это потребует от меня преобразования моих чисел в строку, чего я не хочу.

Ответы [ 2 ]

5 голосов
/ 11 марта 2020

Давайте извлекаем модель в виде словаря для всех этих операторов:

 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) }, 
   };

Тогда вы можете легко реализовать 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));
}

Обратите внимание, что вам нужно Dispose DataTable, поэтому вычисления с помощью DataTable будут выглядеть примерно так:

private static double TableCompute(string formula) {
  using (DataTable table = new DataTable()) {
    return Convert.ToDouble(table.Compute(formula, null));
  }
}
1 голос
/ 11 марта 2020

Для работы DataTable().Compute() преобразование чисел в строку не требуется,

using System;
using System.Data;

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Addition -> " + Calculate(6, 3, "+").ToString());
        Console.WriteLine("Substraction -> " + Calculate(6, 3, "-").ToString());
        Console.WriteLine("Multiplication -> " + Calculate(6, 3, "*").ToString());
        Console.WriteLine("Division -> " + Calculate(6, 3, "/").ToString());
    }

    public static double Calculate(double firstNumber, double secondNumber, string operation)
    {       
        return Convert.ToDouble(new DataTable().Compute(firstNumber + operation + secondNumber, null));
    }
}

Вывод для входных чисел 6 и 3

Addition -> 9
Substraction -> 3
Multiplication -> 18
Division -> 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...