使用Array类型作为参数表达式

时间:2017-08-21 16:30:27

标签: c# linq lambda

声明参数表达式时,例如:

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[]的参数?

1 个答案:

答案 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}");
}