①什么是LinQ?
linq是一类查询数据的方法,它常用于对数据库进行检索,但是不限于数据库(可应用于任何集合类型)。利用Linq,我们可以使用简单的语句完成对数据的搜索、归类、求集等等操作。
②预备知识:Lambda表达式
㈠Lambda表达式的作用:
- 匿名方法(没有类的野方法)
- Inline方法(随写随用,用后立刻销毁)
㈡使用方法:
- Lambda表达式应用于委托中,使用时调用委托即可
- 使用形式为 (形参)=> {函数体}
例:
1 | public static void Main(string[] args) |
㈢语法糖
原句
1 | Func<int,int,int> func=new Func<int,int,int>((int a,int b)=>{return a+b}); |
因为传入值已在委托中规定,故可以不声明形式变量类型而直接调用,同时规定了函数肯定有返回值,所以省略return ↓
1 | Func<int,int,int> func=new Func<int,int,int>((a,b)=>{a+b}); |
因为建立Lambda表达式的过程肯定是新建了一个委托成员,故可以省去new及调用“构造方法”的语句 ↓
1 | Func<int,int,int> func=(a,b)=>{a+b}; |
如果Lambda表达式的内容就一句,完全连大括号也没必要写,最后就成了
1 | Func<int,int,int> func=(a,b)=>a+b; |
③使用LinQ进行数据处理
LinQ本是模仿SQL的语法,但是那种语法在C#程序中就显得格格不入,为此微软又开发了形似C#方法的LinQ语法,为方便理解,以下所讲的语法都是这种语法。
LinQ类似C#方法的语法大多就是利用以上所讲的Lambda表达式语法形式进行书写的,例如,我们有学生的数据集合StudentData
,集合中有很多条学生信息,每条学生信息又包含学生的姓名(Name)、年级(Grade)、班级(Class)等等数据。
㈠现在我们想得到所有的学生姓名,可以这样写:
1 | var nameList=studentData.Select(p=>p.Name).ToList(); |
这句话的意思就是 “选择studentData每条数据中的Name,并且将其返回为一个列表”。 值得注意的是,当我们输入Select()
后,编译器会自动给出提示: 注意Func后面的泛型,这就是提示我们这个Select函数仅接受输入值为StudentData类型,返回TResult类型的委托成员,这也间接限制了我们的Lambda表达式书写格式。
㈡同理,如果我们想要搜索所有名字为“张三”的学生,可以这样写:
1 | var student=studentData.Where(p=>p.Name=="张三").ToList(); |
这次当我们输入Where()
后,编译器自动给出提示为: 可以看到这个Where()
函数仅接受 输入值为StudentData类型,返回值为bool类型的委托成员。 这样我们就得到了所有名字叫”张三”的学生名单。(别忘了句尾的.ToList()) 关于更多LinQ函数,可以去微软官网查询:https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable?view=netframework-4.7.2