0%

【C#】初探Lambda表达式与LinQ

>无扰阅读模式

①什么是LinQ?

linq是一类查询数据的方法,它常用于对数据库进行检索,但是不限于数据库(可应用于任何集合类型)。利用Linq,我们可以使用简单的语句完成对数据的搜索、归类、求集等等操作。

②预备知识:Lambda表达式

㈠Lambda表达式的作用:

  1. 匿名方法(没有类的野方法)
  2. Inline方法(随写随用,用后立刻销毁)

㈡使用方法:

  1. Lambda表达式应用于委托中,使用时调用委托即可
  2. 使用形式为 (形参)=> {函数体}

例:

1
2
3
4
5
6
public static void Main(string[] args)
{
//调用系统定义好的泛型委托Func,第一、二个泛型是传入值,第三个泛型是返回值
Func<int,int,int> func=new Func<int,int,int>((int a,int b)=>{return a+b});//创建包含Lambda表达式的委托成员
Console.WriteLine(func(100,300));//调用委托显示结果。
}

㈢语法糖

原句

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
2
var nameList=studentData.Select(p=>p.Name).ToList();
//studentData是StudentData类的一个对象

这句话的意思就是 “选择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