前段时间在论坛发表了一个提问,
问题题目:“请教Lambda表达式num => num如何用ParameterExpression的方式表示?”
ref:http://topic.youkuaiyun.com/u/20100827/01/75fd7add-553d-4bfd-be95-94fed243757e.html
然而一直没有解决方案,当时研究了很久 也和一些朋友探讨过,但是一直没有结果。
今天下午闲的时候,偶然想到了这个问题,所以拿出来再次研究了一番。
最终,关已攻破!特分享出来。
源代码如下:
class Program
{
static void Main(string[] args)
{
List<decimal> decimals = new List<decimal> { 6.2m, 8.3m, 0.5m, 1.3m, 6.3m, 9.7m };
//创建表达式参数
ParameterExpression param = Expression.Parameter(typeof(decimal), "n");
ParameterExpression[] parameters = new ParameterExpression[] { param };
//创建Lambda表达式主体
//注意:由于排序函数传递的参数类型与返回的参数类型一致,并且都是单个值
//所以Expression的方法将不适用(至少目前来说我没有找到有相应能处理的方法或者函数)
//直接将表达式主体指向参数表达式即可。
Expression body = param; //Expression.GreaterThan(number, zero);
//构造表达式结构树
Expression<Func<decimal, decimal>> orderby = Expression.Lambda<Func<decimal, decimal>>(body, param);
//Expression<Func<decimal, decimal>> filter = n => n;
//BinaryExpression lt = (BinaryExpression)filter.Body;
//执行排序操作
//参数orderby效果等同n=>n
IEnumerable<decimal> query = decimals.AsQueryable().OrderByDescending(orderby);
//打印输出排序结果
query.ToList().ForEach(a => Console.Write(string.Format("{0}/n", a.ToString())));
Console.ReadLine();
}
}