Оценка строки “3* (4+2)” интервал урожая 18 [дубликат]

95
задан huysentruitw 31 December 2015 в 15:16
поделиться

8 ответов

Да, можно позволить компилятору C# оценить его во времени выполнения.

См.: CSharpCorner

42
ответ дан arul 24 November 2019 в 05:42
поделиться

Короткий ответ: Я не думаю так. C#.Net компилируется (в байт-код) и не может оценить строки во времени выполнения, насколько я знаю. JScript.Net может, однако; но я все еще советовал бы Вам кодировать синтаксический анализатор и стековое средство анализа самим.

-1
ответ дан 24 November 2019 в 05:42
поделиться

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

1
ответ дан Tamas Czinege 24 November 2019 в 05:42
поделиться

Вы могли довольно легко выполнить это через CSharpCodeProvider с подходящим пухом, обертывающим его (тип и метод, в основном). Аналогично Вы могли пройти VB и т.д. - или JavaScript, как другой ответ предположил. Я не знаю ни о чем больше встроенном в платформу в этой точке.

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

3
ответ дан Jon Skeet 24 November 2019 в 05:42
поделиться

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

IronPython.Hosting.PythonEngine pythonEngine = new IronPython.Hosting.PythonEngine();
string expression = "3*(2+4)";
double result = pythonEngine.EvaluateAs<double>(expression);

Вы, вероятно, не хотели бы создавать механизм для каждого выражения. Вам также нужна ссылка на IronPython.dll

3
ответ дан Beardo 24 November 2019 в 05:42
поделиться

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

Вот код, который я использовал для своей программы:

public static double Evaluate(string expression)
{
    return (double)new System.Xml.XPath.XPathDocument
    (new StringReader("<r/>")).CreateNavigator().Evaluate
    (string.Format("number({0})", new
    System.Text.RegularExpressions.Regex(@"([\+\-\*])")
    .Replace(expression, " ${1} ")
    .Replace("/", " div ")
    .Replace("%", " mod ")));
}
14
ответ дан 24 November 2019 в 05:42
поделиться

Попробуйте следующее:

static double Evaluate(string expression) {
  var loDataTable = new DataTable();
  var loDataColumn = new DataColumn("Eval", typeof (double), expression);
  loDataTable.Columns.Add(loDataColumn);
  loDataTable.Rows.Add(0);
  return (double) (loDataTable.Rows[0]["Eval"]);
}
49
ответ дан 24 November 2019 в 05:42
поделиться

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

Пример:

Expression e = new Expression("2 + 3 * 5");
Debug.Assert(17 == e.Evaluate());
74
ответ дан 24 November 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: