Лучший и самый короткий способ оценить математические выражения

При использовании черепахи svn в Windows, щелкните правой кнопкой по файлу и перейдите к свойствам. Нажмите новый и добавьте новое свойство svn:mime-типа типа. Для помещенного значения: application/octet-stream

17
задан Eric Leschinski 22 March 2013 в 13:17
поделиться

4 ответа

В дополнение к ответу Томаса на самом деле можно получить доступ к (устаревшим) библиотекам JScript непосредственно из C #, что означает, что вы можете использовать эквивалент функции JScript eval .

using Microsoft.JScript;        // needs a reference to Microsoft.JScript.dll
using Microsoft.JScript.Vsa;    // needs a reference to Microsoft.Vsa.dll

// ...

string expr = "7 + (5 * 4)";
Console.WriteLine(JScriptEval(expr));    // displays 27

// ...

public static double JScriptEval(string expr)
{
    // error checking etc removed for brevity
    return double.Parse(Eval.JScriptEvaluate(expr, _engine).ToString());
}

private static readonly VsaEngine _engine = VsaEngine.CreateEngine();
19
ответ дан 30 November 2019 в 11:18
поделиться

Конечно, это возможно. В основном это делает класс CodeSnippetCompileUnit . Я написал вам пример кода использования. Вам нужно будет включить эти пространства имен:

  • System.CodeDom.Compiler;
  • System.CodeDom;
  • Microsoft.CSharp;
  • System.Reflection;

Вот код:

string source = @"
class MyType
{
    public static int Evaluate(<!parameters!>)
    {
        return <!expression!>;
    }
}
";

string parameters = "int a, int b, int c";
string expression = "a + b * c";

string finalSource = source.Replace("<!parameters!>", parameters).Replace("<!expression!>", expression);

CodeSnippetCompileUnit compileUnit = new CodeSnippetCompileUnit(finalSource);
CodeDomProvider provider = new CSharpCodeProvider();

CompilerParameters parameters = new CompilerParameters();

CompilerResults results = provider.CompileAssemblyFromDom(parameters, compileUnit);

Type type = results.CompiledAssembly.GetType("MyType");
MethodInfo method = type.GetMethod("Evaluate");

// The first parameter is the instance to invoke the method on. Because our Evaluate method is static, we pass null.
int result = (int)method.Invoke(null, new object[] { 4, -3, 2 });

Заменить 'параметры' и 'выражение' какими угодно, и у вас есть общий вычислитель выражений.

Если вы получаете исключение FileNotFoundException в результатах.CompiledAssembly, значит, фрагмент не удалось скомпилировать.

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

13
ответ дан 30 November 2019 в 11:18
поделиться

Хотя использование служб компилятора - простое и эффективное решение, оно вызывает серьезные проблемы с безопасностью, если выражение вводится пользователем, поскольку оно может виртуально выполнить что угодно .

] Есть еще одно очень простое решение, которое намного безопаснее: воспользоваться функцией JScript Eval . Вам просто нужно выполнить следующие шаги:

Создайте файл js с именем JsMath.js:

class JsMath
{
    static function Eval(expression : String) : double
    {
        return eval(expression);
    };
}

Скомпилируйте его в библиотеку классов:

jsc /t:library JsMath.js

Ссылайтесь на библиотеку JsMath в своем проекте C # и используйте ее следующим образом:

double result = JsMath.Eval(expression);
3
ответ дан 30 November 2019 в 11:18
поделиться

Для меня Vici.Parser работает очень хорошо: проверьте его здесь , это самый гибкий синтаксический анализатор выражений, который я нашел до сих пор.

(мы использовали его для создания «удобочитаемых» бизнес-правил с данными, предоставленными базой данных SQL-сервера)

Примеры доступны, и разработчик очень хорошо поддерживает их (проверьте форум веб-сайта) .

3
ответ дан 30 November 2019 в 11:18
поделиться
Другие вопросы по тегам:

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