Выражение парса математики

Есть ли простой способ проанализировать простое математическое выражение, представленное в виде строки, такой как (x + (2 * x) / (1-x)), предоставить значение для x и получить результат?

Я посмотрел VSAEngine на несколько онлайн-примеров, однако, я получаю предупреждение о том, что эта assembly устарела и не использует ее.

Если он делает какие-либо различия, я использую .NET 4.0.

Вы можете попробовать использовать DataTable.Compute .

Связанным является DataColumn.Expression .

Также проверьте: Выполнение математики в vb.net как Eval в javascript

Примечание: Я не использовал их сам.

Я настоятельно рекомендую вам выставить существующий общий оценщик выражений над целевым математическим оценщиком. Причина этого заключается в том, что оценщики выражений не ограничиваются только математикой. Умный человек может использовать это, чтобы создать экземпляр любого типа в структуре и вызвать любой метод в типе, и это позволит ему делать некоторые явно нежелательные вещи. Например: new System.Net.WebClient().DownloadFile("illegalchildpornurl", "C:\openme.gif") в большинстве из них будет очень хорошо оценен и сделает то, что будет похоже (и сделает вас felon в то же время).

Это не значит, что вы не смотрите на то, что уже написано. Это просто значит быть осторожным. Вы хотите, чтобы делали математику, и только математику. Большая часть того, что уже есть, не такая уж придирчивая.

Недавно я использовал mXparser, который является библиотекой математического анализатора. Это дает вам большую гибкость, например переменные, функции, константы, операторы. Ниже вы найдете несколько примеров использования:

Пример 1 – простая формула

 Expression e = new Expression("1 + pi"); double v = e.calculate(); 

Пример 2 – формула с переменными, функциями и т. Д.

 Argument x = new Argument("x = 2"); Constant a = new Constant("a = sin(10)"); Function f = new Function("f(t) = t^2"); Expression e = new Expression("2*x + a - f(10)", x, a, f); double v = e.calculate(); 

https://mxparser.codeplex.com/

http://mathparser.org/

С наилучшими пожеланиями

Я бы тоже посмотрел на Jace ( https://github.com/pieterderycke/Jace ). Jace – высокопроизводительный математический анализатор и вычислительный движок, поддерживающий все разновидности .NET (.NET 4.x, Windows Phone, Windows Store, …). Jace также доступен через NuGet: https://www.nuget.org/packages/Jace

Вот один из способов сделать это. Этот код написан на Java. Обратите внимание, что он не обрабатывает отрицательные числа прямо сейчас, но вы можете добавить это.

 public class ExpressionParser { public double eval(String exp, Map vars){ int bracketCounter = 0; int operatorIndex = -1; for(int i=0; i 

}

Вам нужно импортировать java.util.Map.

Вот как я использую этот код:

  ExpressionParser p = new ExpressionParser(); Map vars = new HashMap(); vars.put("x", 2.50); System.out.println(p.eval(" 5 + 6 * x - 1", vars)); 

Другой вариант, который вы можете изучить, – это функция оценки выражений Spring.NET Framework. Это может сделать намного больше, чем математика.

Тем не менее, вся Spring.NET Framework может быть немного излишней для ваших нужд, если вам не нужны остальные функции.

Связано: синтаксический анализатор выражения с приоритетом .

Когда я ответил в этой теме ( Best Free C # Math Parser, используя переменные, пользовательские функции, пользовательские операторы ), вы можете использовать Mathos Parser , который вы можете просто вставить в свой исходный код.

  Mathos.Parser.MathParser parser = new Mathos.Parser.MathParser(); string expr = "(x+(2*x)/(1-x))"; // the expression decimal result = 0; // the storage of the result parser.LocalVariables.Add("x", 41); // 41 is the value of x result = parser.Parse(expr); // parsing Console.WriteLine(result); // 38.95 

Я рекомендую вам использовать MEEL для этого.

 // parse string to IExpression (symbolic type) IExpression expression = BaseExpression.Parse("(x+(2*x)/(1-x))"); // create your own collection for attributes var attributes = new MathAttributeCollection(); // create local variable named "x" with value 5 var attributeX = new ScalarAttrInt("x") {Value = new ScalarConstInt(5)}; attributes.Add(attributeX); // execute math expression where x=5 var result = expression.Execute(attributes); MessageBox.Show(result.GetText()); // result: 2.5 
  • Пример ковариации и контравариантности в реальном мире
  • Функция рекурсии LINQ?
  • перегрузка метода vs необязательный параметр в C # 4.0
  • Конфликт перегруженных методов с дополнительными параметрами
  • Подключение к Oracle Database через C #?
  • Добавление неизвестных (во время разработки) свойств в ExpandoObject
  • Не содержит конструктор, который принимает 0 аргументов
  • Контракт-первая SOA: Проектирование бизнес-домена: WCF
  • Почему в нашем проекте требуются интерфейсные слои / абстрактные classы?
  • Как я могу имитировать щелчок мышью в определенной позиции на экране?
  • Нет Main () в WPF?
  • Давайте будем гением компьютера.