0

我有一个List<String>充满价值观和运营商的东西。

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

我知道我可以制作一个算法,将这些数字和运算符推入堆栈,然后将它们弹出并在我进行时进行评估。但是,不使用外部库有没有更好的方法呢?

4

4 回答 4

4

将数字和运算符压入堆栈将是一个解释器。

显然更好的方法(对于“更好”的一些定义)是编写一个编译器!

您已经将输入拆分为词法标记,因此您可以跳过实现词法分析器并直接开始构建 AST。您可以在System.​Linq.​Expressions Namespace中找到合适的类来转换您的输入;看看表达式类。您可以将结果包装在 lambda 表达式中,将其编译为 IL 并在 CLR 上执行!

于 2011-08-16T17:39:26.710 回答
2

正如 Mehrdad 所说,您可以加入List,然后让编译器在运行时对其进行评估。

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

我在这里发现了一个非常相似的问题

更新 :

NCalc “NCalc - .NET 的数学表达式评估器”尽管这是一个外部库,但我认为它是一个开源项目,这意味着您可以将代码直接添加到您的项目中。

更新 :

您可以使用该String.Join功能加入列表。

string formula = String.Join("",listMathOperators);
于 2011-08-16T17:41:13.007 回答
0

您始终可以使用 .NET 框架中的 C# 编译器类将其评估为 C# 表达式...

于 2011-08-16T17:34:33.363 回答
0

我有一个计算任何表达式的完整类。

首先,您需要将列表中的所有字符串提取为单个字符串,例如:

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

其次,你需要在解析器中评估这个表达式,我有一个完整的类可以为你做这个,但我不能在这里附加文件。

于 2011-08-16T17:41:49.103 回答