声明参数表达式时,例如:
ParameterExpression x = Expression.Parameter(typeof(double),"x");
然后,您可以使用此参数构造Lambda表达式:
Expression Lowerbound = Expression.Constant(0.0,typeof(double));
Expression GreaterThanorEqual = Expression.GreaterThanOrEqual(x, Lowerbound);
Expression TestExpression = Expression.Lambda(GreaterThanorEqual,x);
Console.WriteLine(TestExpression.ToString());
// returns x => (x >= 0)
我现在需要一种方法来构造表单
的表达式x => (x[0] >= 0)
x => (x[1] >= 0)
x => (x[2] >= 0)
... et cetera
但是,我无法找到定义参数的方法
Expression.Parameter(typeof(double[]),"x");
数组作为一个参数
然后
Expression.Parameter(typeof(double),"x["+i+"]");
另一个
有没有办法定义Type
double[]
的参数?
答案 0 :(得分:1)
为了在表达式期间访问数组,请使用Expression.ArrayIndex
。这需要两个参数:1)从中获取项目的数组,2)传入数组的索引。
以下代码应将表达式编译为委托,该委托采用double[]
数组和int
索引来执行x => x[i] >= 0
表达式。
var arrayParam = Expression.Parameter(typeof(double[]), "x");
var indexParam = Expression.Parameter(typeof(int), "i");
var left = Expression.ArrayIndex(arrayParam, indexParam);
var right = Expression.Constant(0.0, typeof(double));
var body = Expression.GreaterThanOrEqual(left, right);
// Create and compile a lambda expression into a delegate to perform:
// x => x[i] >= 0
var func = Expression.Lambda<Func<double[], int, bool>>(body, arrayParam, indexParam)
.Compile();
double[] data = new double[] { -2.0, -1.0, 0.0, 1.0, 2.0, 3.0 };
for (int i = 0; i < data.Length; i++)
{
var d = data[i];
var x = func(data, i);
Console.WriteLine($"i: {d} => {x}");
}