C# вычислить несколько вычислений из строки

Я делаю калькулятор в C# (winforms), и мне было интересно, есть ли простой способ вычислить строку с несколькими вычислениями в нем, например, если у вас есть строка "124+241/2*5" позвольте программе вычислить это и затем получить выходной int.

Заранее спасибо.

5 ответов

Решение

Ну, вы в основном ищете C# эквивалент Javascript eval() функция.

Я рекомендую библиотеку NCalc.

var result = new Expression("124+241/2*5").Evaluate()

Другим вычислительным движком будет Jace.NET.

Dictionary<string, double> variables = new Dictionary<string, double>();
variables.Add("var1", 2.5);
variables.Add("var2", 3.4);

CalculationEngine engine = new CalculationEngine();
double result = engine.Calculate("var1*var2", variables);

Также есть Dynamic Expresso.

var result = new Interpreter().Eval("124+241/2*5");

И вы можете использовать Roslyn's ScriptingEngine для оценки:

Roslyn.Scripting.Session session = roslynEngine.CreateSession();
session.Execute("124+241/2*5");

Ну, на самом деле "простой" - это довольно широкий термин... относительный, я бы сказал. В любом случае, есть несколько библиотек, которые зарекомендовали себя как очень надежные и очень популярные для таких вещей, как эта.

Первый - это NCALC ( http://ncalc.codeplex.com/):

// One of the examples.
Expression e = new Expression("2 + 3 * 5");

Второй - Jace.NET ( https://github.com/pieterderycke/Jace):

// One of the examples.
CalculationEngine engine = new CalculationEngine();
Func<Dictionary<string, double>, double> formula = engine.Build("var1+2/(3*otherVariable)");

Dictionary<string, double> variables = new Dictionary<string, double>();
variables.Add("var1", 2);
variables.Add("otherVariable", 4.2);

double result = formula(variables);

Оба фантастические, но из предыдущего опыта я обнаружил, что Jace.NET работает немного лучше на более сложных выражениях (для вас это не должно быть проблемой).

Если я вас правильно понимаю, вам нужно что-то подобное: Dynamic Expresso. Вы можете добавить это в свою программу с помощью NuGet.

Не существует автоматического способа сделать это, вам придется либо анализировать его вручную, либо использовать какую-то функциональность, эквивалентную JavaScript eval(),

Хорошая альтернатива, которая не требует использования внешних библиотек System.Data.DataTable.Compute:

public double Evaluate(string expr)
{
    System.Data.DataTable table = new System.Data.DataTable();
    return Convert.ToDouble(table.Compute(expr, String.Empty));
}

CodeDom и Reflection дают вам возможность динамически встраивать C# -код в строку, компилировать и запускать все это внутри вашей программы. Эта очень мощная функция в.NET позволяет нам создавать калькулятор CodeDom, калькулятор, который оценивает выражения (и даже строки кода C#) внутри формы Windows.

http://www.c-sharpcorner.com/UploadFile/mgold/CodeDomCalculator08082005003253AM/CodeDomCalculator.aspx

Другие вопросы по тегам