Lambda

一.Lambda的演变

Lambda的演变,从下面的类中可以看出,.Net Framwork1.0时还是用方法实例化委托的,2.0的时候出现了匿名方法,3.0的时候出现了Lambda。

lambda组成是:左边(参数列表)+中间( ()=>符号,表示gose to)+右边(方法体)。无论怎么演变,lambda本质上还是一个方法

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace _15_linq
8 {
9 /// <summary>
10 /// lambda表达式是什么??
11 /// 1.lambda说是一个方法也不准确,作用和方法是一样的
12 /// 2.lambda,实际上是一个类中类,里面的一个internal方法,然后绑定到静态的委托类型字段,通过反编译可以看着这些。
13 /// </summary>
14 public class lambadaShow
15 {
16 public delegate void MyDelegate();
17 public delegate void MyDelegateWhithPara(int x, int y);
18 public void Show()
19 {
20 {
21 //.NTE1.0的做法, 使用委托三部曲:声明,实例化,调用
22 MyDelegate MyDelegateHander = new MyDelegate(Show1);
23 MyDelegateHander.Invoke();
24 }
25
26 {
27 int i = 100;
28 //.NET 2.0 匿名方法,微软考虑可能要写很多方法,多麻烦啊。这里升级直接把方法搬过来,
29 //去掉方法名,加上delegate关键字就行了。
30 MyDelegate myDelegate = new MyDelegate(delegate ()
31 {
32 Console.WriteLine(i);//这里还有一个小知识点,就是匿名方法可以访问外部变量
33 Console.WriteLine("MyDelegate Show");
34 });
35 }
36
37 {
38 //.NET 3.0 lambada(作用跟方法一样) 去掉关键字,加上=> gese to
39 //左边参数列表 + gose to+方法体。本质是一个方法
40 //lambada本质:实际上是一个类中类,里面有一个internal方法,然后被绑定到静态的委托字段
41 MyDelegate myDelegate = new MyDelegate(() =>
42 {
43 Console.WriteLine("MyDelegate Show");
44 });
45 MyDelegateWhithPara myDelegateWhithPara = new MyDelegateWhithPara((int x, int y) => { Console.WriteLine("MyDelegate Show"); });
46 MyDelegateWhithPara myDelegateWhithPara1 = new MyDelegateWhithPara((x, y) => { Console.WriteLine("MyDelegate Show"); });//可以省略参数类型,编译器自动计算
47
48 MyDelegateWhithPara myDelegateWhithPara2 = (x, y) => { Console.WriteLine("MyDelegate Show"); };//简化版本的实例化委托
49 }
50 }
51 public void Show1()
52 {
53 Console.WriteLine("MyDelegate Show");
54 }
55 }
56 }

二.从IL层面解读委托
lambda:
实际上是一个类中类,里面的一个internal方法,然后被绑定到静态的委托类型字段

三.Linq

.Net Framework3.0出现了匿名方法,匿名类,lambda,var,扩展方法,这些都是为linq服务的。

1.扩展方法

扩展方法:静态类里面的静态方法,第一个参数类型前面加上this。

扩展方法用途:可以不修改类,或者没办法修改类的情况下,给类添加方法。

 1 using System;
2 using System.Runtime.CompilerServices;
3 using System.Threading;
4 using System.Threading.Tasks;
5
6 namespace ConsoleApp1
7 {
8 class Program
9 {
10 static void Main(string[] args)
11 {
12 Student student = new Student
13 {
14 Name = "王小二",
15 Id = 1,
16 Age = 33,
17 };
18 student.Study();
19 student.Sing<Student>();//扩展方法
20 bool result = 123.Then(12);//扩展方法
21 Console.ReadKey();
22 }
23 }
24 public static class Extend
25 {
26 public static void Sing<T>(this T source) where T : Student
27 {
28 Console.WriteLine($"{source.Name}:Sing a Song");
29 }
30 public static bool Then(this int int1, int int2)
31 {
32 return int1 > int2;
33 }
34 }
35 /// <summary>
36 /// 学生类
37 /// </summary>
38 public class Student
39 {
40 public string Name { get; set; }
41 public int Id { get; set; }
42 public int Age { get; set; }
43 public void Study()
44 {
45 Console.WriteLine("我在学习!");
46 }
47 }
48 }

2.匿名类

匿名类,在匿名类的语法中,并没有为其命名,而是直接一个new{ }了事的。

var ,object,dynamic这三个是啥?

1>var 是由编译器自动推算的

2>object是一个具体的类型

3>dynamic 主要就是避开编译器的检查


 1     class Program
2 {
3 static void Main(string[] args)
4 {
5 //匿名类
6 /*var:
7 * 1>是一个语法糖,由编译器自动推算
8 * 2>var必须在声明的时候就确定类型,类型确定后就不能修改
9 * 3>配合匿名类类型一起使用*/
10 var student = new
11 {
12 Id=1,
13 Name="匿名类",
14 Age=35,
15 };
16 Console.WriteLine($"匿名类:{student.Id},{student.Name},{student.Age}");
17
18 //object是一种具体类型,不存在Id或者其他属性的
19 object ostudent = new
20 {
21 Id = 2,
22 Name = "object类型",
23 Age = 36,
24 };
25 //Console.WriteLine(ostudent.Id); //object是一种类型,不存在Id或者其他属性的
26
27 //dynamic就是避开编译器的检查
28 dynamic dStudent = new
29 {
30 Id = 1,
31 Name = "dynamic类型",
32 Age = 35,
33 };
34 Console.WriteLine($"dynamic类型:{dStudent.Id},{dStudent.Name},{dStudent.Age}");
35 Console.ReadKey();
36 }
37 }

下面开始进入正题,说说linq,以及一些常用的:

1>过滤小能手:Where方法

Where完成对数据集合的过滤,需要提供一个带bool返回值的“筛选器”(匿名方法,委托,lambda表达式都可以),从而表明数据集合中某个元素是否被返回。

2>投影小行家Select方法

Select是完成对数据的转换,返回新的对象集合。

3>排序小牛OrderBy

OrderBy是完成对数据的排序

4>连接小助手Join

Join连接两个类之间的关联联系

5>分组教授GroupBy

GroupBy对数据集合进行分类

下面代码对于上面进行了验证,运行结果如下

  1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 namespace ConsoleApp1
5 {
6 class Program
7 {
8 public delegate bool MyDelegate(Student student);
9 static void Main(string[] args)
10 {
11 LinqShow linkShow = new LinqShow();
12 linkShow.Show();
13 Console.ReadKey();
14 }
15 }
16 public class LinqShow
17 {
18 #region 先准备一堆学生
19 static List<Student> GetStudentList()
20 {
21 List<Student> listStudent = new List<Student>()
22 {
23 new Student(){Id=4,Gender= true, Name="小四", Age=33,},
24 new Student(){Id=1,Gender= false, Name="王小一", Age=30,},
25 new Student(){Id=2,Gender= true, Name="王小二", Age=31,},
26 new Student(){Id=3,Gender= false, Name="王小三", Age=32,},
27 };
28 return listStudent;
29 }
30 static List<Class> GetClassList()
31 {
32 List<Class> listClass = new List<Class>()
33 {
34 new Class()
35 {
36 ClassId=1,
37 ClassName="初级班",
38 },
39 new Class()
40 {
41 ClassId=2,
42 ClassName="高级班",
43 },
44 new Class()
45 {
46 ClassId=3,
47 ClassName="架构班",
48 },
49 new Class()
50 {
51 ClassId=4,
52 ClassName="微信班",
53 },
54 };
55 return listClass;
56 }
57 #endregion
58
59 /// <summary>
60 /// Linq To Object(Enumerable)
61 /// Where:完成对数据集合的过滤,通过委托封装完成通用代码,泛型+迭代器去提供特性
62 /// </summary>
63 public void Show()
64 {
65 #region linq to object Show
66 List<Student> listStudent = GetStudentList();
67 List<Class> listClass = GetClassList();
68 Console.WriteLine("*****************where 1***********************");
69 {//where 完成对数据集合的筛选
70 var list1 = from s in listStudent
71 where s.Age > 30 && s.Gender == true
72 select s;
73 foreach (var item in list1)
74 {
75 Console.WriteLine(item.Age);
76 }
77
78 }
79 {//where 完成对数据集合的筛选
80 Console.WriteLine("****************Where 2************************");
81 var list = listStudent.Where<Student>(s => s.Age > 30 && s.Gender == true);
82 foreach (var item in list)
83 {
84 Console.WriteLine(item.Age);
85 }
86 }
87 {//Select 完成对数据的转换
88 Console.WriteLine("****************Select 1************************");
89 var list = from s in listStudent
90 where s.Age > 30
91 select new
92 {
93 IdName = s.Id + s.Name,
94 AgeName = s.Age + s.Name,
95 };
96 foreach (var item in list)
97 {
98 Console.WriteLine($"{item.IdName},{item.AgeName}");
99 }
100 }
101
102 {//Select 完成对数据的转换
103 Console.WriteLine("****************Select 2************************");
104 var list2 = listStudent.Where<Student>(s => s.Age > 30).Select(s => new
105 {
106 IdName = s.Id + s.Name,
107 AgePerson = s.Age == 33 ? "大龄了" : "也不小了",
108 });
109 foreach (var item in list2)
110 {
111 Console.WriteLine(item.IdName + item.AgePerson);
112 }
113 //或者
114 var list2_1 = listStudent.Where<Student>(s => s.Age > 30)
115 .Select(s => new
116 {
117 Name = s.Name,
118 Age = s.Age,
119 Length = s.Name.Length
120 });
121 foreach (var item in list2_1)
122 {
123 Console.WriteLine($"{item.Name},{item.Age},{item.Length}");
124 }
125 }
126 {//OrderBy完成对数据集合的排序,按照Id排序之前Id=4的“小四”是在第一个位置的,排序后“小四”在最后了
127 Console.WriteLine("*******************OrderBy*********************");
128 var list3 = listStudent.Where<Student>(s => s.Age > 10)
129 .OrderBy(s => s.Id);
130 foreach (var item in list3)
131 {
132 Console.WriteLine(item.Name);
133 }
134 }
135 { //Skip 跳过几条,从输出结果可见,“小四”这条信息被跳过去了
136 Console.WriteLine("*******************Skip*********************");
137 var list3 = listStudent.Where<Student>(s => s.Age > 10)
138 .Select(s => new
139 {
140 IdOrder = s.Id,
141 NameId = s.Name + s.Id,
142 AgeId = s.Age + s.Id,
143 })
144 .OrderBy(s => s.IdOrder)
145 .Skip(1);
146 foreach (var item in list3)
147 {
148 Console.WriteLine(item.NameId);
149 }
150 }
151 {
152 //Take 获取几条,从输出结果可见,获取了前面两条信息:"小四","王小一"
153 Console.WriteLine("*******************Take*********************");
154 var list3 = listStudent.Where<Student>(s => s.Age > 10)
155 .Take(2);
156 foreach (var item in list3)
157 {
158 Console.WriteLine(item.Name);
159 }
160 }
161 {//group by
162 Console.WriteLine("*****************GroupBy********************");
163 var list4 = from s in listStudent
164 where s.Age > 30
165 group s by s.Id into sg
166 select new
167 {
168 key = sg.Key,
169 maxAge = sg.Max(t => t.Age)
170 };
171 foreach (var item in list4)
172 {
173 Console.WriteLine($"key={item.key},maxAge={item.maxAge}");
174 }
175 }
176 {//GroupBy
177 Console.WriteLine("*******************GroupBy******************");
178 var list5 = listStudent.GroupBy(s => s.Gender == true);
179 foreach (var group in list5)
180 {
181 Console.WriteLine(string.Format("group:{0}", group.Key == true ? "男" : "女"));
182 foreach (var p in group)
183 {
184 Console.WriteLine(p.Name);
185 }
186 }
187 }
188 {//join
189 {
190 Console.WriteLine("******************join********************");
191 var list6 = from s in listStudent
192 join c in listClass on s.Id equals c.ClassId
193 select new
194 {
195 Name = s.Name,
196 ClassName = c.ClassName
197 };
198 foreach (var item in list6)
199 {
200 Console.WriteLine($"Name={item.Name},ClassName={item.ClassName}");
201 }
202
203 Console.WriteLine("******************join********************");
204 var list7 = listStudent.Join(listClass, s => s.Id, c => c.ClassId, (s, c) => new
205 {
206 Name = s.Name,
207 ClassName = c.ClassName
208 });
209 foreach (var item in list7)
210 {
211 Console.WriteLine($"{item.Name},{item.ClassName}");
212 }
213 }
214 }
215 #endregion
216 }
217 }
218
219 /// <summary>
220 /// 学生类
221 /// </summary>
222 public class Student
223 {
224 public string Name { get; set; }
225 public int Id { get; set; }
226 public int Age { get; set; }
227 public bool Gender { get; set; }
228 public override string ToString()
229 {
230 return string.Format("{0}-{1}-{2}-{3}", Id, Name, Age, Gender == true ? "男" : "女");
231 }
232 public void Study()
233 {
234 Console.WriteLine("我在学习!");
235 }
236 }
237 /// <summary>
238 /// 班级实体
239 /// </summary>
240 public class Class
241 {
242 public int ClassId { get; set; }
243 public string ClassName { get; set; }
244 }
245 }

C#Lambda表达式演变和Linq的深度解析的更多相关文章

  1. Lambda表达式演变

    Lambda表达式是一种匿名函数.   演变步骤:   一般的方法委托 => 匿名函数委托 => Lambda表达式   Lambda表达式其实并不陌生,他的前生就是匿名函数,所以要谈La ...

  2. 思考一个关于Lambda表达式做为linq条件的问题

    有一个集合如下 List<User> users = new List<User> { new User{Name = "1",Aget = 12}, ne ...

  3. Lambda表达式演变历史

    /// <summary> /// 爬虫委托 /// </summary> /// <param name="crawlerCode">爬虫编码 ...

  4. LINQ to Objects系列(3)深入理解Lambda表达式

    Lambda表达式是学好LINQ很重要的一个知识点,后面的LINQ查询中会大量地使用到Lambda表达式.这篇文章从以下几点进行总结. 1,Lambda表达式的前世今生 2,Lambda表达式的实际运 ...

  5. 动态LINQ(Lambda表达式)构建

    using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...

  6. C#中的Lambda表达式和表达式树

    在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...

  7. Lambda表达式和表达式树

    在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...

  8. 委托,匿名函数和lambda表达式

    很早之前就接触到了委托,但是一直对他用的不是太多,主要是本人是菜鸟,能写的比较高级的代码确实不多,但是最近在看MSDN微软的类库的时候,发现了微软的类库好多都用到了委托,于是决定好好的研究研究,加深一 ...

  9. Lambda 表达式[MSDN]

    Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数.Lambda 表达式对于编写 LINQ 查 ...

随机推荐

  1. 版本控制之git

    1.Git的介绍 Git 是一个开源的分布式版本控制软件,用以有效.高速的处理从很小到非常大的项目版本管理. Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发.Git ...

  2. mysql Bad handshake

    由于 Java 程序访问 MySQL 时,MySQL 抛出 Bad handshake 错误,导致接口抛错,然后在 MySQL 配置文件新增 skip_ssl 配置(忽略 SSL 密钥和证书文件),重 ...

  3. mybatis plus 的 ActiveRecord 模式

    实体类继承 Model public class Test extends Model<Test> implements Serializable {} 就可以 new Test().in ...

  4. 李阳:京东零售OLAP平台建设和场景实践

    导读: 今天和大家分享京东零售OLAP平台的建设和场景的实践,主要包括四大部分: 管控面建设 优化技巧 典型业务 大促备战 -- 01 管控面建设 1. 管控面介绍 管控面可以提供高可靠高效可持续运维 ...

  5. 824. Goat Latin - LeetCode

    Questioin 824. Goat Latin Solution 题目大意:根据要求翻译句子 思路:转换成单词数组,遍历数组,根据要求转换单词 Java实现: 用Java8的流实现,效率太低 pu ...

  6. 144_Power Pivot贷款之等额本息与等额本金

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 买房贷款的时候会遇到等额本息与等额本金的问题,今天做了一个两者对比,看看如何选择,来一张对比图. 等额本息的前期 ...

  7. 安装Tomcat到Linux(源码)

    运行环境 系统版本:CentOS Linux release 7.3.1611 软件版本:Tomcat-9.0.11 硬件要求:无 安装过程 1.安装YUM-EPEL存储库 YUM-EPEL存储库由E ...

  8. 第31章 Spring bean 作用域

    每日一句 I must say a word about fear. It is life's only true opponent. Only fear can defeat life. 这里必须说 ...

  9. drools执行完某个规则后终止别的规则执行

    目录 1.背景 2.需求 3.实现方案 1.通过Fact判断 2.通过全局变量判断 3.通过halt方法 4.实现上述需求 4.1 drl 文件编写 4.2 运行结果 5.完整代码 1.背景 在我们开 ...

  10. 《Effective C++》阅读总结(二):类的构造、析构和赋值

    今天是周六早上,但很不幸待会儿还是要去公司,本月kpi还剩一些工作要做,这个月计划的Effective C++学习,也基本完成了,最后一章节模板相关那部分还看不太懂,就大概过了一遍.现在是收尾总结阶段 ...