Lamdba 表达式
在上述的表达式中,仅仅只有当参数只有一个的时候,括号是可省略的,例如下面这种含有两个参数时候的情况应该是这样子的写法
1 | (a,b)=>a==b |
当表达式中的多个参数编译器无法自动判断类型的时候,则需要显式指定类型。
1 | ( int firstIndex, string str) => str.IndexOf( 'Hello' ) > firstIndex |
在C#的List集合中,我们时常需要使用到大量的运算或者筛选等操作,按常规的方式无非就是利用foreach或者for对List集合进行循环操作,最后运算出结果。此种方法往往需要写多行语句,阅读性稍微差点,当然复杂的情况下编写也费时。博主遇到这种情况一般比较喜欢偷懒,很少会去直接写循环,而是直接使用Lambda表达式一条语句完成。
先假定好我们待会使用的范例的格式:
studentList对象:此对象是一个List集合,集合中的对象为学生实体Student。此集合中存放着整个学校学生的信息。
scoreList对象:此对象是个List集合,集合中的对象是成绩实体Score,此集合中存放着为学生的成绩信息。
Student实体:此实体包含下列几个属性,StudentName,StudentCode,ClassCode,ClassName,BirthDay,Grade。以上几个英文单词都比较简单,就不做解释了。
Score实体:此实体包含下列几个属性,StudentCode,SubjectName(科目名称),ScoreValue(分数,0-100的数字)。一个学生可能有多门成绩数据存放在此。
(1)查询班级编号为1001的班级下面的所有学生实体并返回到list1001中存储
1 | var list1001=Studentlist.Where(t=>t.ClassCode==‘1001’); |
(2)查询班级编号为1001的班级下面的所有学生实体并返回到list1001中存储,并按照学生的出生日期从小到大排列。
1 | var list1001=Studentlist.Where(t=>t.ClassCode==‘1001’).OrderBy(t=>t.BirthDay); |
在此说一下,OrderBy是从小到大排序,需要从大到小排列则用OrderByDescending。
(3)查询班级编号为1001的班级下面的姓氏为【李】的同学的所有集合,并按照学生的出生日期从小到大排列。
1 | var list1001=Studentlist.Where(t=>t.ClassCode==‘1001’&&t.StudentName.StartWith(“李”)).OrderBy(t=>t.BirthDay); |
(4)查询出班级编号为1001的班级,并且存在至少一门考试科目成绩低于60分的所有同学。
1 | var result = studentList.Where(t => (t.ClassCode == "1001" ) && (scoreList.Exists(p => p.ScoreValue < 60 && p.StudentCode == t.StudentCode))); |
在上述语句中,lambda表达式中再次嵌入了一个lambda表达式。t参数是studentList中的lambda表达式参数,代表实体为student。p参数为scoreList中的lambda表达式参数,代表的实体为score。
(5)其他较常用的Lambda表达式如下:
var a = studentList.FirstOrDefault(t => t.StudentCode == "10012");//FirstOrDefault返回第一个符合条件的数据,不存在的时候返回Null。 var b = studentList.Count(t => t.StudentName == "李世民");//返回符合条件的实体个数 var c = studentList.FindAll(t => t.StudentName.Contains("中"));//查找所有名字中含有【中】的实体集合 var d = studentList.GroupBy(t => t.ClassCode);//对studentList按照ClassCode分组 var f = studentList.Max(t => t.BirthDay);//返回最大的出生日期。 var e = scoreList.Sum(t => t.ScoreValue);//对所有成绩求和 var g = scoreList.Average(t => t.ScoreValue);//对所有成绩求平均分 var h = studentList.Select(t => t.StudentName).Distinct();//获取所有的学生姓名,并去除重名