Lambda 简单了解

      //Lambda 

            //匿名方法
//delegate (Student s) { return s.Age > 12 && s.Age < 20; };
//Lable 表达式 (代替了上面的)
//s => s.Age > 12 && s.Age < 20 //在Lambda Expression 中指定多个参数
//(s, youngAge) => s.Age >= youngage;
//指定参数类型
//(Student s, int youngAge) => s.Age >= youngage; //没有参数的Lambda表达式
//() => Console.WriteLine("Parameter less lambda expression") //多语句Lambda表达式
//(s, youngAge) =>
//{
// Console.WriteLine("Lambda expression with multiple statements in the body");
// Return s.Age >= youngAge;
//}

将Lambda表达式分配给委派

lambda表达式可以分配给Func<in T, out TResult>类型委托。Func委托中的最后一个参数类型是返回类型,其余是输入参数。而Action<int T> 类型委托,只有输入参数,不返回。

例如:

  Func<Student, bool> isStudentTeenAger = x => x.Age >  && x.Age < ;
Student std = new Student { Age = };
bool isTeen = isStudentTeenAger(std);//false

这个委托我们可以来用方法表示

 bool isStudentTeenAger(Student s)
{
return s.Age > && s.Age < ;
}

Action:

  Action<Student> PrintStudentDetail = s => Console.WriteLine("Name: {0}, Age: {1} ", s.StudentName, s.Age);
Student std = new Student() { StudentName = "Bill", Age = };
PrintStudentDetail(std);//output: Name: Bill, Age: 21

Linq中的Func:

  IList<Student> studentList = new List<Student>() {
new Student { Age=, StudentName="sealee" },
new Student { Age=, StudentName="sealee2" },
}; Func<Student, bool> isStudentTeenAger = s => s.Age > && s.Age < ;
var teenStudents = studentList.Where(isStudentTeenAger).ToList<Student>();

LINQ中的表达式

我们已经了解到lambda Expression可以分配给Func或Action类型委托来处理内存中的集合。.NET编译器在编译时将分配给Func或Action类型委托的lambda表达式转换为可执行代码。

LINQ引入了名为Expression的新类型,它表示强类型的lambda表达式。这意味着lambda表达式也可以分配给Expression <TDelegate>类型。.NET编译器将分配给Expression <TDelegate>的lambda表达式转换为表达式树而不是可执行代码。

  //定义表达式
//Func 方法
// Func<Student, bool> isTeenAger = s => s.Age > 12 && s.Age < 20;
//使用Expresson包装Func委托将上述Func类型委托转换为表达式,如下所示:
Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > && s.Age < ; //调用表达式
Func<Student, bool> isTeenAger = isTeenAgerExpr.Compile();
//Invoke
bool result = isTeenAger(new Student() { ID = , StudentName = "Steve", Age = });

使用:

  //IEnumerable  studentList
IList<Student> studentList = new List<Student>() {
new Student { Age=, StudentName="sealee" },
new Student { Age=, StudentName="sealee2" },
};
Func<Student, bool> isStudentTeenAger = s => s.Age > && s.Age < ;
//OutDto 是我们自己定义的返回类 实际情况一般针对我们的返回接口都会生成一个单独的Dto来返回
Expression<Func<Student, OutDto>> outDto =
s => new OutDto { AAgeDto = s.Age, StudentNameDto = s.StudentName };
var teenStudents = studentList.Where(isStudentTeenAger).AsQueryable().Select(outDto);
//AsQueryable 注意这里,select(Expression) 需要我们是IQueryable
//IEnumerable 使用的是 Func
//IQueryable 使用的是 Expression<Func

Linq 表达的更多相关文章

  1. c#LINQ表达树

    如果你已经用过LINQ, 你应该知道函数方式,以及包含的丰富的类库, 如果你仍不了解, 那根据下面的链接去熟悉一下 the LINQ tutorial,  lambda. 表达树提供了丰富的包含参数的 ...

  2. Linq表达树(固定参数)

    这篇博客只能用来批判因为我刚刚学习linq对它了解只有简单的linq to sql 的语句所以来写这个博客只能说是班门弄斧了,看的下去的话就坚持看吧. 在网上看了别人的文章目前水平有限借鉴别人的思想吧 ...

  3. .Net 分布式云平台基础服务建设说明概要

    1)  背景 建设云平台的基础框架,用于支持各类云服务的业务的构建及发展. 2)  基础服务 根据目前对业务的理解和发展方向,总结抽象出以下几个基础服务,如图所示 3)  概要说明 基础服务的发展会根 ...

  4. .NET深入实战系列--EF到底怎么写过滤条件

    本文唯一访问地址:http://www.cnblogs.com/yubaolee/p/DynamicLinq.html 对于系统开发来说,按不同字段进行过滤查询是一种常见的需求.在EF中通常的做法是: ...

  5. MongoDB 分页查询的方法及性能

    最近有点忙,本来有好多东西可以总结,Redis系列其实还应该有四.五.六...不过<Redis in Action>还没读完,等读完再来总结,不然太水,对不起读者. 自从上次Redis之后 ...

  6. .NET深入实战系列--EF到底怎么写过滤条件(转)

    原文来自:http://www.cnblogs.com/yubaolee/p/DynamicLinq.html 对于系统开发来说,按不同字段进行过滤查询是一种常见的需求.在EF中通常的做法是: /// ...

  7. C#MongoDB 分页查询的方法及性能

    传统的SQL分页 传统的sql分页,所有的方案几乎是绕不开row_number的,对于需要各种排序,复杂查询的场景,row_number就是杀手锏.另外,针对现在的web很流行的poll/push加载 ...

  8. Mego(03) - ORM框架的新选择

    前言 从之前的两遍文章可以看出ORM的现状. Mego(01) - NET中主流ORM框架性能对比 Mego(02) - NET主流ORM框架分析 首先我们先谈下一个我们希望的ORM框架是什么样子的: ...

  9. asp.net core系列 33 EF查询数据 (2)

    一. 原生SQL查询 接着上篇讲.通过 Entity Framework Core 可以在使用关系数据库时下降到原始 SQL 查询. 在无法使用 LINQ 表达要执行的查询时,或因使用 LINQ 查询 ...

随机推荐

  1. Redis安装、配置

    一.Redis安装 Linux安装 下载tar包,移至Linux目录下 解压:tar -zxvf redis-4.0.1.tar.gz 安装gcc:yum install gcc-c++(编译失败需安 ...

  2. kotlin语法

    https://try.kotlinlang.org/#/Examples/Hello,%20world!/Simplest%20version/Simplest%20version.kt /** * ...

  3. vue双向绑定笔记

    原文:https://github.com/louzhedong/blog/issues/4 <!DOCTYPE html> <html lang="en"> ...

  4. VS code 自定义快捷输入

    本文是从简书复制的, markdown语法可能有些出入, 想看"正版"和更多内容请关注 简书: 小贤笔记 位置 ctrl+shift+p 搜索: snippets 输入类型: 比如 ...

  5. 22_CopyOnWrite容器

    [简述] Copy-On-Write简称COW,是一种程序设计中的优化策略. JDK里的COW容器分为两种:CopyOnWriteArrayList 和 CopyOnWriteArraySet. Co ...

  6. Python爬虫教程-15-读取cookie(人人网)和SSL(12306官网)

    Python爬虫教程-15-爬虫读取cookie(人人网)和SSL(12306官网) 上一篇写道关于存储cookie文件,本篇介绍怎样读取cookie文件 cookie的读取 案例v16ssl文件:h ...

  7. 【Python】区分List 和String

    区分String和list String can't mutate 每次变更实质上开辟新的资源 List 可变更 警惕指针

  8. angular中的scope

    angular.element($0).scope() 什么是scope? scope是一个refer to the application model的object.它是一个expression的执 ...

  9. js前台实现上传图片的预览

    网上这样的插件一大堆,不过还是谈下js下代码的实现,加深这方面的理解. 当然也没有一种方式就可以完事的情形,主要就两种方面来处理: 1.file API的filereader接口完成(支持的浏览器:I ...

  10. 【Leetcode】【Hard】Reverse Nodes in k-Group

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...