C#中利用Expression表达式树进行多个Lambda表达式合并
在上一文中介绍使用了合并两个Lambda表达式,能两个就能多个,代码如下图所示:
public static class ExpressionHelp{private static Expression<T> Combine<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge){MyExpressionVisitor visitor = new MyExpressionVisitor(first.Parameters[0]);Expression bodyone = visitor.Visit(first.Body);Expression bodytwo = visitor.Visit(second.Body);return Expression.Lambda<T>(merge(bodyone,bodytwo),first.Parameters[0]);}public static Expression<Func<T, bool>> ExpressionAnd<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second){return first.Combine(second, Expression.And);}public static Expression<Func<T, bool>> ExpressionOr<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second){return first.Combine(second, Expression.Or);}}public class MyExpressionVisitor : ExpressionVisitor{public ParameterExpression _Parameter { get; set; }public MyExpressionVisitor(ParameterExpression Parameter){_Parameter = Parameter;}protected override Expression VisitParameter(ParameterExpression p){return _Parameter;}public override Expression Visit(Expression node){return base.Visit(node);//Visit会根据VisitParameter()方法返回的Expression修改这里的node变量}}
假设存在如下数据集合:
public class Person{public string Name { get; set; }public string Gender { get; set; }public int Age { get; set; }public List<Phone> Phones { get; set; }}List<Person> PersonLists = new List<Person>(){new Person { Name = "张三",Age = 20,Gender = "男",Phones = new List<Phone> {new Phone { Country = "中国", City = "北京", Name = "小米" },new Phone { Country = "中国",City = "北京",Name = "华为"},new Phone { Country = "中国",City = "北京",Name = "联想"},new Phone { Country = "中国",City = "台北",Name = "魅族"},}},new Person { Name = "松下",Age = 30,Gender = "男",Phones = new List<Phone> {new Phone { Country = "日本",City = "东京",Name = "索尼"},new Phone { Country = "日本",City = "大阪",Name = "夏普"},new Phone { Country = "日本",City = "东京",Name = "松下"},}},new Person { Name = "克里斯",Age = 40,Gender = "男",Phones = new List<Phone> {new Phone { Country = "美国",City = "加州",Name = "苹果"},new Phone { Country = "美国",City = "华盛顿",Name = "三星"},new Phone { Country = "美国",City = "华盛顿",Name = "HTC"}}}};
And操作使用如下图所示:
Expression<Func<Person, bool>> expression = ex => ex.Age == 30;
expression = expression.ExpressionAnd(t => t.Name.Equals("松下"));
var Lists = PersonLists.Where(expression.Compile());
foreach (var List in Lists)
{Console.WriteLine(List.Name);
}
Console.Read();
Or操作使用如下图所示:
Expression<Func<Person, bool>> expression = ex => ex.Age == 20;
expression = expression.ExpressionOr(t => t.Name.Equals("松下"));
var Lists = PersonLists.Where(expression.Compile());
foreach (var List in Lists)
{Console.WriteLine(List.Name);
}
Console.Read();
C#中利用Expression表达式树进行多个Lambda表达式合并相关推荐
- part01.03 委托与 Lambda 表达式(三):Lambda 表达式
"Lambda 表达式"是一个匿名函数,它可以包含表达式和语句,用于创建委托或表达式树类型 A. 用Lambda表达式代替匿名方法,复杂冗长的形式 格式:( 显式类型参数列表 )= ...
- 表达式树 php,Linux_LINQ学习笔记:表达式树,构建查询表达式
本节中, 我们 - phpStudy...
构建查询表达式 本节中, 我们假设我们拥有一个这样的实体类: 1: [Table] public partial class Product 2: 3: { 4: 5: [Column(IsPrima ...
- C# Lambda表达式详解,及Lambda表达式树的创建
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...
- lambda表达式函数接口_函数Lambda表达式中UnaryOperator的示例
lambda表达式函数接口 Java 8 Lambda表达式的实现需要介绍一些具有深奥名称的新接口,这些接口可能会对没有任何函数式编程经验的开发人员造成一定的威胁. 功能性UnaryOperator接 ...
- java lambda表达式_「JAVA8」- Lambda 表达式
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lambda 表达式可以使代码变的更加 ...
- java 8 lamda,Java8中你可能不知道的一些地方之Lambda表达式实战
Java8 引入 Lambda 表达式,允许开发者将函数当成参数传递给某个方法,或者把代码本身当作数据进行处理.使用 Lambda 表达式,使得应用变得简洁而紧凑. 很多语言(Groovy.Scala ...
- 表达式树使用(二)【修改表达式树】
Just because someone stumbles loses their way,it doesn't mean they're lost forever.Sometimes we all ...
- Python学习 Day8-2 python的三元表达式(三目运算符)、lambda表达式、内置函数
Python中的三元表达式(三目运算符) 语法:为真时的结果 if 判断条件 else 为假时的结果(注意,没有冒号) >>print(1 if 5 > 3 else 0) 1 Py ...
- java lamdba表达式效率_java8新特性Lambda表达式为什么运行效率低
Lambda表达式为什么运行效率低 准备 我为什么说Lambda表达式运行效率低. 先准备一个list: 先用Lambda表达式的方式来循环一下这个list: 运行时间大概为110ms 再用普通方式来 ...
最新文章
- opencv python 生成画布_用Python做自己的2020专属Flag动图
- Windows Server 2012改造成Windows8的方法(转载)
- Spring Boot-切换嵌入式Servlet容器
- [转]详细介绍java中的数据结构
- Interesting Array CodeForces - 483D(思维+线段树)
- win7 蓝牙4.0 ble驱动_初识物联网无线通信技术之蓝牙4.0BLE协议栈
- ospf hello时间和dead_网络工程师_思科 | OSPF由简到难,配合命令学
- 科研|饶毅:科学在被淘汰的博士后引领下狂奔
- vld不输出泄漏信息_UV固化设备不单单只有灯管!还有哪些辅动部件?
- 软件测试模型-敏捷模型
- 当我在linux图形界面终端输入startx,我在干什么
- SSH dao层异常 org.hibernate.HibernateException: No Session found for current thread
- 在libevent中服务模型
- 微信支付 ---- (商户号该产品权限处罚中)
- 融合不是冗余,全栈自研才有出路?特斯拉/Mobileye这样做
- 信息学奥赛一本通1032
- 华三交换机配置DHCP中继
- MySQL数据库实操教程(24)——用户管理
- 透镜成像、眼球成像、小孔成像原理
- wpf中使用ListView
热门文章
- 右击菜单一键优化(增加新建office2003、新建reg和bat,删除新建公文包、新建wps、新建rar)...
- centos 6 安装zabbix 3.0
- resize属性,使textarea在ff(火狐)中禁止拉伸
- 不使用Vmware easy install 安装
- 微型计算机控制技术试卷B,微型计算机控制技术试卷b..doc
- Mac os区别_SN及Mac地址烧录
- c语言源程序最多可能由组成,一个C语言源程序由若干函数组成,其中至少应含有一个()。...
- stl中map函数_map :: max_size()函数,以及C ++ STL中的Example
- np.expm1_JavaScript中带有示例的Math.expm1()方法
- excel添加列下拉框票价_excel表格下拉表格添加数据-excel2017表格中怎么制作下拉菜单列表框...