хотя я ценю попытку, которая привела бы к строке, содержащей 332.

отаю над приложением в C #, в котором я хочу вычислить арифметическое выражение, которое дается в виде строки. Итак, как я получил строку:

string myExpr="4*(80+(5/2))+2";

И я хочу вычислить результат арифметического выражения. В то время как на языке, таком как Javascript, PHP и т. Д., Вы могли бы просто использовать Eval, чтобы сделать трюк, это, кажется, не вариант в C #.

Я предполагаю, что можно написать код, чтобы разделить его на бесчисленные простые выражения, вычислить их и сложить вместе, но это займет довольно много времени, и у меня, вероятно, будет много неприятностей в моей попытке сделать это.

Итак ... мой вопрос, есть ли «простой» способ сделать это?

 Austin Salonen06 янв. 2011 г., 23:20
 Ben Voigt07 янв. 2011 г., 04:25

Ответы на вопрос(9)

Я использовалNCalc с большим успехом. Он очень гибкий и учитывает переменные в ваших формулах. Формула, которую вы указали в своем вопросе, может быть легко оценена:

string myExpr = "4*(80+(5/2))+2";
decimal result = Convert.ToDecimal(new Expression(myExpr).Evaluate());

и я нашел это

Обратная польская запись в C #

Учебник и код должны быть чрезвычайно ценными.

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

Язык программирования C ++В главе 6 он объясняет шаг за шагом (в C ++), как делать именно то, что предлагает Крис Таварес.

Это просто, но немного опрометчиво, если вы не знакомы с процедурой.

http://ncalc.codeplex.com ?

Это расширяемое, быстрое (например, имеет собственный кэш) позволяет вам предоставлять пользовательские функции и переменные во время выполнения путем обработки событий EvaluateFunction / EvaluateParameter. Примеры выражений, которые он может анализировать:

Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)");

  e.Parameters["Pi2"] = new Expression("Pi * Pi");
  e.Parameters["X"] = 10;

  e.EvaluateParameter += delegate(string name, ParameterArgs args)
    {
      if (name == "Pi")
      args.Result = 3.14;
    };

  Debug.Assert(117.07 == e.Evaluate());

Он также обрабатывает Unicode и многие типы данных изначально. Он поставляется с файлом рога, если вы хотите изменить грамматику. Существует также форк, который поддерживает MEF для загрузки новых функций.

Он также поддерживает логические операторы, строки даты / времени и операторы if.

eval функция. Любой язык .NET может вызывать любой другой.

если у вас есть фон, но это не «просто». Eval в интерпретируемой среде фактически перезапускает синтаксический анализатор над строкой; вам нужно эмулировать эту операцию для битов, которые вас интересуют, в вашем коде C #.

Начните поиск по «оценщикам выражений» и «анализатору рекурсивного спуска».

Попробуйте что-то вроде этого:

int mySum = 4*(80+(5/2))+2;

var myStringSum = mySum.toString();
 user606 янв. 2011 г., 23:22
хотя я ценю попытку, которая привела бы к строке, содержащей 332.
 Matt Greer06 янв. 2011 г., 23:12
Он хочет, по сути, противоположность этому. Выражение хранится в строке.
 Austin Salonen06 янв. 2011 г., 23:22
 Austin Salonen06 янв. 2011 г., 23:21
Это должно быть голосование, чтобы закрыть, а не пытаться собрать репутацию ...
Решение Вопроса

на которую вы можете ссылаться, а затем просто сделайте что-то вроде:

var engine = VsaEngine.CreateEngine();
Eval.JScriptEvaluate(mySum, engine);

Редактировать; Библиотека является Microsoft.JScript

 Sam11 июл. 2011 г., 15:58
VS2010 говорит: Microsoft.JScript.Vsa.VsaEngine устарела.
 user606 янв. 2011 г., 23:28
выглядит очень многообещающе, это первый тест для меня. Спасибо всем за фантастическую и чертовски быструю помощь = D

Ваш ответ на вопрос