2012-04-08 2 views
1

Мне нужно включить пользователя, чтобы он мог написать собственную формулу в datagridview. Что-то вроде функции в Excel.C#, определяемая пользователем формула

Пример определения формулы:

x http://oi40.tinypic.com/6e2004.jpg

Таким образом, пользователь написать свою собственную формулу в формуле ячейки, а затем в другой таблице показан результат для каждого. Как я могу это сделать?

+0

Ничего, потому что я не знаю, как это сделать. – user1320251

+0

Если вы не парсер, который может анализировать и оценивать простые формулы, то вы должны посмотреть на NCalc: http://ncalc.codeplex.com/ –

ответ

0

Ваша формула может быть обработана на C# и динамически скомпилирована с использованием SystemCodeCom.Compiler, и вы можете запускать ее на лету, подавая ваши значения переменных.
В противном случае вам придется внедрить какой-то мини-парсер/компилятор - это довольно специфический навык и который может быстро усложниться - особенно если ваши формулы становятся более сложными (что, вероятно, возможно).
Имеются статьи кодекса об динамической комплиментации here и here. Но в Интернете есть много других примеров.

+0

Tnx! Я постараюсь с динамической комплиментацией. – user1320251

+0

На мой взгляд, динамическая компиляция (как это делается в средних примерах в Интернете) довольно плохая, поскольку каждый новый скомпилированный элемент добавляет домен приложения и больше не может быть выгружен. Лучшие подходы создают собственный домен приложений, но при общении с динамическим скомпилированным кодом возникает много накладных расходов. Для формул я использую формулярный парсер, например, например. [этот] (http://www.codeproject.com/Articles/7335/An-extensible-math-expression-parser-with-plug-ins). –

+1

@UweKeim Hm, который выглядит довольно хорошо - возможно, достойный отдельного ответа! – Ricibob

0

Существует несколько способов сделать это, все они вращаются вокруг преобразования формулы в исполняемый код. Вы хотите написать собственный синтаксический анализатор или использовать существующий. C#, IronPython, IronRuby, некоторые из компонентов полки. Если вы используете полный синтаксический анализатор, вы можете посмотреть, как ограничить то, что пользователь может сделать с ним, непреднамеренно или иначе ...

Если они такие же простые, как они выглядят, своего рода построитель выражений (pick два именованных значения и оператор) может быть способом, но модульно, как для создания выражения, так и для его оценки, чтобы вы могли усилить его в какой-то более поздний момент.

Однако, как бы они ни казались простыми, у меня возникло бы желание предопределить выражения (загруженные как метаданные из своего рода хранилища резервных копий и заставить его выбрать один из них, а не пользователь, вводящий его. тратить месяцы на этом аспекте дизайна, это стоит?

1

Я хотел бы попробовать NCalc

NCalc является математическим выражением оценщика в .NET. NCalc может разобрать любое выражение и оценить результат, в том числе статического или динамические параметры и пользовательские функции.

Dictionary<string, int> dict = new Dictionary<string, int>() { { "Income", 1000 }, { "Tax", 5 } }; 

string expressionString = "Income * Tax"; 
NCalc.Expression expr = new NCalc.Expression(expressionString); 
expr.EvaluateParameter += (name, args) => 
    { 
     args.Result = dict[name]; 
    }; 

int result = (int)expr.Evaluate(); 
+0

Я смотрю на все решения, и на данный момент NCals - это, возможно, самое простое решение для моей проблемы. Спасибо всем за помощь. – user1320251

0

У меня было аналогичное требование (динамический анализ выражений) недавно в проекте, над которым я работаю, и в конечном итоге использовал выражения VB из WF (Windows Workflow Foundation). Это, безусловно, зависит от того, насколько важна эта функция для вас и сколько усилий вы готовы внести в нее. В моем случае это оказалось лучше, чем NCalc по нескольким причинам:

  • поддерживает более сложные выражения, чем NCalc
  • в результате экспрессии деревья могут быть проанализированы для определения зависимостей для отдельных выражений
  • это тот же язык выражения, как в WF (который я уже использовал в другом месте проекта)

В любом случае, here is a short blogpost Я написал на эту тему.

Смежные вопросы