Оценочный список <String>как математическое выражение - PullRequest
0 голосов
/ 16 августа 2011

У меня есть List<String>, который полон значений и операторов.

["123", "+", "(", "890", "-", "15.00", ")"]

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

Ответы [ 4 ]

4 голосов
/ 16 августа 2011

Перевод чисел и операторов в стек будет интерпретатором.

Очевидный лучший способ сделать это (для некоторого определения «лучше») - написать компилятор!

У вас уже есть входные данные, разделенные на лексические токены, так что вы можете пропустить реализацию лексера и погрузиться прямо в построение AST. В системе можно найти подходящие классы для преобразования вашего ввода. Linq. Expressions Namespace ; взгляните на Expression Class . Вы можете заключить результат в лямбда-выражение, скомпилировать его в IL и выполнить в CLR!

2 голосов
/ 16 августа 2011

Вы можете присоединиться к List и затем позволить компилятору оценить его во время выполнения, как заявил Мехрдад.

Expression e = new Expression("5 * 2"); 
e.Evaluate();

Я нашел очень похожий вопрос, уже задаваемый здесь

обновление:

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

Обновление:

Вы можете использовать функцию String.Join для присоединения к списку.

string formula = String.Join("",listMathOperators);
0 голосов
/ 16 августа 2011

У меня есть полный класс, который вычисляет любое выражение.

Сначала вам нужно извлечь все строки из вашего списка в одну строку, например:

string sExpression = "123+(890-15.00)";

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

0 голосов
/ 16 августа 2011

Вы всегда можете использовать классы компилятора C # в .NET Framework, чтобы оценить его как выражение C # ...

...