Как вычислить выражение - PullRequest
       4

Как вычислить выражение

1 голос
/ 25 января 2012

Рассмотрим этот фрагмент кода;

int sum = 0;
sum = Expression.Evaluate("1+1");

где значение sum = 2

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

Ответы [ 3 ]

1 голос
/ 25 января 2012

Вы можете использовать деревья выражений:

Деревья выражений представляют код в древовидной структуре данных, где каждый узел является выражением, например, вызовом метода или двоичной операцией, такой как x

Вы можете компилировать и запускать код, представленный деревьями выражений.

Примечание : эту проблему можно решить с помощью System.Reflection.Emit иработать напрямую с MSIL, но полученный код трудно писать и читать.

После небольшого просмотра я предлагаю вам проверить Flee на Codeplex: Fast Lightweight Expression Evaluator :

Flee - анализатор и оценщик выражений для .NETфреймворк. Это позволяет вам вычислять значение строковых выражений, таких как sqrt (a ^ 2 + b ^ 2) во время выполнения .Он использует собственный компилятор, язык выражений со строгой типизацией и легкий кодовый код для компиляции выражений непосредственно в IL.Это означает, что вычисление выражений чрезвычайно быстро и эффективно.

0 голосов
/ 09 марта 2012

Вы видели 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.

0 голосов
/ 25 января 2012

Вы можете построить деревья выражений либо с помощью лямбда-выражений, либо с помощью программного построения, используя классы в пространстве имен System.Linq.Expressions.

См. MSDN для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...