C# lambda 和 Linq

本章节给大家带来的是Lambda 和 Linq 的关系

Lambda : 是实例化委托的一个参数,也就是一个方法

Linq:是基于委托(lambda)的封装,代码重用,逻辑解耦,是一个帮助类库,linq是用泛型,委托,lamda实现的,总的来说:把对数据操作的通用部分完成,把可变的交给委托,使用者只关心可变部分。

一、Lambda

文章的开始已经说明Lambda是实例化委托的一个参数,也就是一个方法。那么我们通过代码来体现一下:

1{ 2 //.NetFramework 1.0-1.1的时候这样应用 3 NoReturnNoPara method = new NoReturnNoPara(DoNothing); 4 method.Invoke(); 5 6 7 //.NetFramwork2.0 匿名方法出现,delegate关键字,可以访问局部变量 8 int i = 0; 9 NoReturnWithPara method1 = new NoReturnWithPara(delegate (int id, int age) 10 { 11 Console.WriteLine(i); 12 Console.WriteLine($"{id} 今年{age}岁了!"); 13 }); 14 method1.Invoke(1, 30); 15 16 17 //.NetFramwork3.0 把delegate关键字去掉,然后增加了一个箭头goes to 18 //lambda表达式:参数列表=>方法体 19 NoReturnWithPara method2 = new NoReturnWithPara((int id, int age) => 20 { 21 Console.WriteLine(i); 22 Console.WriteLine($"{id} 今年{age}岁了!"); 23 }); 24 method2.Invoke(1, 30); 25 26 NoReturnWithPara method3 = new NoReturnWithPara((id, age) => 27 { //省略参数类型,但是编译器可以根据委托推断出类型,是语法糖 28 Console.WriteLine(i); 29 Console.WriteLine($"{id} 今年{age}岁了!"); 30 }); 31 method3.Invoke(1, 30); 32 33 //如果方法体只有一行,可以去掉大括号和分号 34 NoReturnWithPara method4 = new NoReturnWithPara((id, age) => Console.WriteLine($"{id} 今年{age}岁了!")); 35 method4.Invoke(1, 30); 36 37 //如果方法体只有一行,可以去掉大括号和分号,还可以去掉new NoReturnWithPara,这个也是编译器语法糖 38 NoReturnWithPara method5 = (id, age) => Console.WriteLine($"{id} 今年{age}岁了!"); 39 method4.Invoke(1, 30); 40 41 //下面带有返回值的 42 Func<int> func0 = () => { return DateTime.Now.Month; };//有一个返回值 43 Func<int> func1 = () => DateTime.Now.Month; //如果方法体只有一行,去掉大括号分号和return 44 45}

使用反编译工具看会产生一个私有sealed类,然后会看到lambda表达式都会生成一个方法名字,然后都会在包括在Sealed类里面

二、Linq

很多人会把Linq和lambda混淆,面试的时候问lambda是什么,很多同学反问不就是Linq吗?

文章开头也讲述了Linq是基于委托(lambda)的封装,代码重用,逻辑解耦,是一个帮助类库,linq是用泛型,委托,lamda实现的,总的来说:把对数据操作的通用部分完成,把可变的交给委托,使用者只关心可变部分。接下来举个例子让大家可以更好的认识Linq和使用Linq

首先初始化一些基础数据:

1private List<Student> GetStudentList() 2{ 3 #region 初始化数据 4 List<Student> studentList = new List<Student>() 5 { 6 new Student() 7 { 8 Id=1, 9 Name="赵亮", 10 ClassId=2, 11 Age=35 12 }, 13 new Student() 14 { 15 Id=1, 16 Name="再努力一点", 17 ClassId=2, 18 Age=23 19 }, 20 new Student() 21 { 22 Id=1, 23 Name="王炸", 24 ClassId=2, 25 Age=27 26 }, 27 new Student() 28 { 29 Id=1, 30 Name="疯子科学家", 31 ClassId=2, 32 Age=26 33 }, 34 new Student() 35 { 36 Id=1, 37 Name="灭", 38 ClassId=2, 39 Age=25 40 }, 41 new Student() 42 { 43 Id=1, 44 Name="黑骑士", 45 ClassId=2, 46 Age=24 47 }, 48 new Student() 49 { 50 Id=1, 51 Name="故乡的风", 52 ClassId=2, 53 Age=21 54 }, 55 new Student() 56 { 57 Id=1, 58 Name="晴天", 59 ClassId=2, 60 Age=22 61 }, 62 new Student() 63 { 64 Id=1, 65 Name="旭光", 66 ClassId=2, 67 Age=34 68 }, 69 new Student() 70 { 71 Id=1, 72 Name="oldkwok", 73 ClassId=2, 74 Age=30 75 }, 76 new Student() 77 { 78 Id=1, 79 Name="乐儿", 80 ClassId=2, 81 Age=30 82 }, 83 new Student() 84 { 85 Id=1, 86 Name="暴风轻语", 87 ClassId=2, 88 Age=30 89 }, 90 new Student() 91 { 92 Id=1, 93 Name="一个人的孤单", 94 ClassId=2, 95 Age=28 96 }, 97 new Student() 98 { 99 Id=1, 100 Name="小张", 101 ClassId=2, 102 Age=30 103 }, 104 new Student() 105 { 106 Id=3, 107 Name="阿亮", 108 ClassId=3, 109 Age=30 110 }, 111 new Student() 112 { 113 Id=4, 114 Name="37度", 115 ClassId=4, 116 Age=30 117 } 118 , 119 new Student() 120 { 121 Id=4, 122 Name="关耳", 123 ClassId=4, 124 Age=30 125 } 126 , 127 new Student() 128 { 129 Id=4, 130 Name="耳机侠", 131 ClassId=4, 132 Age=30 133 }, 134 new Student() 135 { 136 Id=4, 137 Name="Wheat", 138 ClassId=4, 139 Age=30 140 }, 141 new Student() 142 { 143 Id=4, 144 Name="Heaven", 145 ClassId=4, 146 Age=22 147 }, 148 new Student() 149 { 150 Id=4, 151 Name="等待你的微笑", 152 ClassId=4, 153 Age=23 154 }, 155 new Student() 156 { 157 Id=4, 158 Name="畅", 159 ClassId=4, 160 Age=25 161 }, 162 new Student() 163 { 164 Id=4, 165 Name="混无痕", 166 ClassId=4, 167 Age=26 168 }, 169 new Student() 170 { 171 Id=4, 172 Name="37度", 173 ClassId=4, 174 Age=28 175 }, 176 new Student() 177 { 178 Id=4, 179 Name="新的世界", 180 ClassId=4, 181 Age=30 182 }, 183 new Student() 184 { 185 Id=4, 186 Name="Rui", 187 ClassId=4, 188 Age=30 189 }, 190 new Student() 191 { 192 Id=4, 193 Name="帆", 194 ClassId=4, 195 Age=30 196 }, 197 new Student() 198 { 199 Id=4, 200 Name="肩膀", 201 ClassId=4, 202 Age=30 203 }, 204 new Student() 205 { 206 Id=4, 207 Name="孤独的根号三", 208 ClassId=4, 209 Age=30 210 } 211 }; 212 #endregion 213 return studentList; 214}

View Code

只要实现了IEnumerable这个接口,都是可以使用 where,Count等方法,只要底层是实现IEnumerable的,都是linq to object 

linq To object 是.netFramwork3.0的一个非常重大的改变

下面展示一下linq to object 的几种使用方式

1#region linq to object Show 2{ 3 Console.WriteLine("********************"); 4 var list = from s in studentList 5 where s.Age < 30 6 select s; 7 8 foreach (var item in list) 9 { 10 Console.WriteLine("Name={0} Age={1}", item.Name, item.Age); 11 } 12} 13 14{ 15 Console.WriteLine("********************"); 16 var list = studentList.Where<Student>(s => s.Age < 30) 17 .Select(s => new 18 { 19 IdName = s.Id + s.Name, 20 ClassName = s.ClassId == 2 ? "高级班" : "其他班" 21 }); 22 foreach (var item in list) 23 { 24 Console.WriteLine("Name={0} Age={1}", item.ClassName, item.IdName); 25 } 26} 27{ 28 Console.WriteLine("********************"); 29 var list = from s in studentList 30 where s.Age < 30 31 select new 32 { 33 IdName = s.Id + s.Name, 34 ClassName = s.ClassId == 2 ? "高级班" : "其他班" 35 }; 36 37 foreach (var item in list) 38 { 39 Console.WriteLine("Name={0} Age={1}", item.ClassName, item.IdName); 40 } 41} 42{ 43 Console.WriteLine("********************"); 44 var list = studentList.Where<Student>(s => s.Age < 30)//条件过滤 45 .Select(s => new//投影 46 { 47 Id = s.Id, 48 ClassId = s.ClassId, 49 IdName = s.Id + s.Name, 50 ClassName = s.ClassId == 2 ? "高级班" : "其他班" 51 }) 52 .OrderBy(s => s.Id)//排序 53 54 .OrderByDescending(s => s.ClassId)//倒排 55 .Skip(2)//跳过几条 56 .Take(3)//获取几条 57 ; 58 foreach (var item in list) 59 { 60 Console.WriteLine($"Name={item.ClassName} Age={item.IdName}"); 61 } 62} 63{//group by 64 Console.WriteLine("********************"); 65 var list = from s in studentList 66 where s.Age < 30 67 group s by s.ClassId into sg 68 select new 69 { 70 key = sg.Key, 71 maxAge = sg.Max(t => t.Age) 72 }; 73 foreach (var item in list) 74 { 75 Console.WriteLine($"key={item.key} maxAge={item.maxAge}"); 76 } 77 //group by new {s.ClassId,s.Age} 78 //group by new {A=s.ClassId>1} 79} 80{ 81 Console.WriteLine("********************"); 82 var list = studentList.GroupBy(s => s.ClassId).Select(sg => new 83 { 84 key = sg.Key, 85 maxAge = sg.Max(t => t.Age) 86 }); 87 foreach (var item in list) 88 { 89 Console.WriteLine($"key={item.key} maxAge={item.maxAge}"); 90 } 91} 92List<Class> classList = new List<Class>() 93 { 94 new Class() 95 { 96 Id=1, 97 ClassName="初级班" 98 }, 99 new Class() 100 { 101 Id=2, 102 ClassName="高级班" 103 }, 104 new Class() 105 { 106 Id=3, 107 ClassName="微信小程序" 108 }, 109 }; 110{ 111 var list = from s in studentList 112 join c in classList on s.ClassId equals c.Id 113 select new 114 { 115 Name = s.Name, 116 CalssName = c.ClassName 117 }; 118 foreach (var item in list) 119 { 120 Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}"); 121 } 122} 123{ 124 var list = studentList.Join(classList, s => s.ClassId, c => c.Id, (s, c) => new 125 { 126 Name = s.Name, 127 CalssName = c.ClassName 128 }); 129 foreach (var item in list) 130 { 131 Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}"); 132 } 133} 134{//左连接 135 var list = from s in studentList 136 join c in classList on s.ClassId equals c.Id 137 into scList 138 from sc in scList.DefaultIfEmpty()// 139 select new 140 { 141 Name = s.Name, 142 CalssName = sc == null ? "无班级" : sc.ClassName//c变sc,为空则用 143 }; 144 foreach (var item in list) 145 { 146 Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}"); 147 } 148 Console.WriteLine(list.Count()); 149} 150{ 151 var list = studentList.Join(classList, s => s.ClassId, c => c.Id, (s, c) => new 152 { 153 Name = s.Name, 154 CalssName = c.ClassName 155 }).DefaultIfEmpty();//为空就没有了 156 foreach (var item in list) 157 { 158 Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}"); 159 } 160 Console.WriteLine(list.Count()); 161} 162#endregion

 linq to sql 运用的是表达式目录树,这个底层是实现的IQueryable,概念和linq to object是不一样的!

参考文章:https://www.cnblogs.com/loverwangshan/p/10182516.html

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )