C #, пользовательская формула

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

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

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

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

 user132025108 апр. 2012 г., 15:04
Пока ничего, потому что я понятия не имею, как это сделать.
 Elian Ebbing08 апр. 2012 г., 15:08
Если вам нужен синтаксический анализатор, который может анализировать и оценивать простые формулы, то вам стоит взглянуть на NCalc:ncalc.codeplex.com

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

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

 08 апр. 2012 г., 15:12
@UweKeim Хм, это выглядит довольно мило - вероятно, заслуживает отдельного ответа!
 08 апр. 2012 г., 15:09
На мой взгляд, динамическая компиляция (как это делается в обычных примерах в Интернете) довольно плохая, поскольку каждый новый скомпилированный элемент добавляется в домен приложения и больше не может быть выгружен. Лучшие подходы создают свой собственный домен приложения, но при общении с динамически скомпилированным кодом возникает много накладных расходов. Для формул я использую формульный парсер, например,this one.
 user132025108 апр. 2012 г., 15:05
Tnx! Я попробую с динамической компиляцией.

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

it supports more complex expressions than NCalc the resulting expression trees can be analyzed to determine dependencies for individual expressions it's the same language for expressions as in WF (which I already use elsewhere in the project)

Тем не мение,вот короткий пост Я написал по этому вопросу.

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

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

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

я бы попробовалNCalc

NCalc is a mathematical expressions evaluator in .NET. NCalc can parse any expression and evaluate the result, including static or dynamic parameters and custom functions.

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();
 user132025108 апр. 2012 г., 15:50
Я смотрю на все решения, и на данный момент NCals, возможно, является самым простым решением для моей проблемы. Спасибо всем за помощь.

Я создалсинтаксический анализатор альбатросов несколько лет назад. Это был открытый исходный код, но я наконец-то нашел и опубликовал v2.02 и недавно добавил документацию. Это активно поддерживается. У него есть пара приятных особенностей:

Circular reference detection Source variable from external object directly Reversed generation of expressions Properly documented

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