假设我允许用户输入任意数值表达式,该表达式允许使用显式函数集和预定义变量。
解释这一点非常简单,但如果性能是一个关键因素怎么办?
我需要一种方法(在运行时)将带有表达式的字符串编译为可以使用变量上的不同值执行 20K 次的内容。
最佳答案
所以你真的想将字符串解析为(最终)一个类型化的委托(delegate)。
一个选项,然后它将字符串解析为表达式
,然后您可以将其编译为 lambda。这相当复杂,但我有一些代码可以完成大部分工作 - 但可能现有的解析器已经完全完成了这项工作。
作为一个简单的表达式
示例:
var x = Expression.Parameter(typeof(double), "x");
var y = Expression.Parameter(typeof(double), "y");
var body = Expression.Multiply(x, y);
var func = Expression.Lambda<Func<double, double,double>>(body, x, y).Compile();
double z = func(123.45, 678.90);
问题出在解析代码的其余部分;-p
上周我向 Expression
解析器编写了一个 string
,但它的代码比我通常在这里发布的代码要多......超过 300 行(不包括识别定制的外部函数或命名参数(当前使用匿名“?”占位符)。
但是如果(如您所说)解释很容易,那么也许可以使用类似的代码来编写可以编译的Expression
?
关于C# 编译数值表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/380424/