我有List<String>
,其中包含值和运算符。
["123", "+", "(", "890", "-", "15.00", ")"]
我知道我可以制作一个算法,将这些数字和操作符推送到堆栈上然后将其弹出并进行评估。但是,如果不使用外部库,还有更好的方法吗?
答案 0 :(得分:4)
将数字和运算符推送到堆栈上将是一个解释器。
明显更好的方法(对于“更好”的定义)是编写编译器!
您已经将输入拆分为词法标记,因此您可以跳过实施词法分析器并可以直接构建AST。您可以在System.Linq.Expressions Namespace中找到合适的类来转换您的输入;看看Expression Class。您可以将结果包装在lambda表达式中,将其编译为IL并在CLR上执行它!
答案 1 :(得分:2)
您可以加入List
,然后让编译器在运行时对其进行评估,如Mehrdad所述。
Expression e = new Expression("5 * 2");
e.Evaluate();
我发现了一个非常类似的问题here
更新:
NCalc“NCalc - .NET的数学表达式评估器”即使这是一个外部库,我认为它是一个开源项目,这意味着你可以直接将代码添加到你的项目中。
更新:
您可以使用String.Join
功能加入列表。
string formula = String.Join("",listMathOperators);
答案 2 :(得分:0)
您始终可以使用.NET框架中的C#编译器类将其评估为C#表达式...
答案 3 :(得分:0)
我有一个完整的类来计算任何表达式。
首先,您需要将列表的所有字符串提取为单个字符串,例如:
string sExpression = "123+(890-15.00)";
其次,你需要在解析器中评估这个表达式,我有一个完整的类为你做这个,但我不能在这里附加文件。