C# lambda 和 Linq

Stella981
• 阅读 673

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

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

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

一、Lambda

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

{
    //.NetFramework 1.0-1.1的时候这样应用
    NoReturnNoPara method = new NoReturnNoPara(DoNothing);
    method.Invoke();


    //.NetFramwork2.0 匿名方法出现,delegate关键字,可以访问局部变量
    int i = 0;
    NoReturnWithPara method1 = new NoReturnWithPara(delegate (int id, int age)
    {
        Console.WriteLine(i);
        Console.WriteLine($"{id} 今年{age}岁了!");
    });
    method1.Invoke(1, 30);


    //.NetFramwork3.0 把delegate关键字去掉,然后增加了一个箭头goes to
    //lambda表达式:参数列表=>方法体
    NoReturnWithPara method2 = new NoReturnWithPara((int id, int age) =>
    {
        Console.WriteLine(i);
        Console.WriteLine($"{id} 今年{age}岁了!");
    });
    method2.Invoke(1, 30);

    NoReturnWithPara method3 = new NoReturnWithPara((id, age) =>
    { //省略参数类型,但是编译器可以根据委托推断出类型,是语法糖
        Console.WriteLine(i);
        Console.WriteLine($"{id} 今年{age}岁了!");
    });
    method3.Invoke(1, 30);

    //如果方法体只有一行,可以去掉大括号和分号
    NoReturnWithPara method4 = new NoReturnWithPara((id, age) => Console.WriteLine($"{id} 今年{age}岁了!"));
    method4.Invoke(1, 30);

    //如果方法体只有一行,可以去掉大括号和分号,还可以去掉new NoReturnWithPara,这个也是编译器语法糖
    NoReturnWithPara method5 = (id, age) => Console.WriteLine($"{id} 今年{age}岁了!");
    method4.Invoke(1, 30);

    //下面带有返回值的
    Func<int> func0 = () => { return DateTime.Now.Month; };//有一个返回值
    Func<int> func1 = () => DateTime.Now.Month; //如果方法体只有一行,去掉大括号分号和return

}

C# lambda 和  Linq

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

二、Linq

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

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

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

C# lambda 和  Linq C# lambda 和  Linq

private List<Student> GetStudentList()
{
    #region 初始化数据
    List<Student> studentList = new List<Student>()
            {
                new Student()
                {
                    Id=1,
                    Name="赵亮",
                    ClassId=2,
                    Age=35
                },
                new Student()
                {
                    Id=1,
                    Name="再努力一点",
                    ClassId=2,
                    Age=23
                },
                 new Student()
                {
                    Id=1,
                    Name="王炸",
                    ClassId=2,
                    Age=27
                },
                 new Student()
                {
                    Id=1,
                    Name="疯子科学家",
                    ClassId=2,
                    Age=26
                },
                new Student()
                {
                    Id=1,
                    Name="灭",
                    ClassId=2,
                    Age=25
                },
                new Student()
                {
                    Id=1,
                    Name="黑骑士",
                    ClassId=2,
                    Age=24
                },
                new Student()
                {
                    Id=1,
                    Name="故乡的风",
                    ClassId=2,
                    Age=21
                },
                 new Student()
                {
                    Id=1,
                    Name="晴天",
                    ClassId=2,
                    Age=22
                },
                 new Student()
                {
                    Id=1,
                    Name="旭光",
                    ClassId=2,
                    Age=34
                },
                 new Student()
                {
                    Id=1,
                    Name="oldkwok",
                    ClassId=2,
                    Age=30
                },
                new Student()
                {
                    Id=1,
                    Name="乐儿",
                    ClassId=2,
                    Age=30
                },
                new Student()
                {
                    Id=1,
                    Name="暴风轻语",
                    ClassId=2,
                    Age=30
                },
                new Student()
                {
                    Id=1,
                    Name="一个人的孤单",
                    ClassId=2,
                    Age=28
                },
                new Student()
                {
                    Id=1,
                    Name="小张",
                    ClassId=2,
                    Age=30
                },
                 new Student()
                {
                    Id=3,
                    Name="阿亮",
                    ClassId=3,
                    Age=30
                },
                  new Student()
                {
                    Id=4,
                    Name="37度",
                    ClassId=4,
                    Age=30
                }
                  ,
                  new Student()
                {
                    Id=4,
                    Name="关耳",
                    ClassId=4,
                    Age=30
                }
                  ,
                  new Student()
                {
                    Id=4,
                    Name="耳机侠",
                    ClassId=4,
                    Age=30
                },
                  new Student()
                {
                    Id=4,
                    Name="Wheat",
                    ClassId=4,
                    Age=30
                },
                  new Student()
                {
                    Id=4,
                    Name="Heaven",
                    ClassId=4,
                    Age=22
                },
                  new Student()
                {
                    Id=4,
                    Name="等待你的微笑",
                    ClassId=4,
                    Age=23
                },
                  new Student()
                {
                    Id=4,
                    Name="畅",
                    ClassId=4,
                    Age=25
                },
                  new Student()
                {
                    Id=4,
                    Name="混无痕",
                    ClassId=4,
                    Age=26
                },
                  new Student()
                {
                    Id=4,
                    Name="37度",
                    ClassId=4,
                    Age=28
                },
                  new Student()
                {
                    Id=4,
                    Name="新的世界",
                    ClassId=4,
                    Age=30
                },
                  new Student()
                {
                    Id=4,
                    Name="Rui",
                    ClassId=4,
                    Age=30
                },
                  new Student()
                {
                    Id=4,
                    Name="帆",
                    ClassId=4,
                    Age=30
                },
                  new Student()
                {
                    Id=4,
                    Name="肩膀",
                    ClassId=4,
                    Age=30
                },
                  new Student()
                {
                    Id=4,
                    Name="孤独的根号三",
                    ClassId=4,
                    Age=30
                }
            };
    #endregion
    return studentList;
}

View Code

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

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

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

#region linq to object Show
{
    Console.WriteLine("********************");
    var list = from s in studentList
                where s.Age < 30
                select s;

    foreach (var item in list)
    {
        Console.WriteLine("Name={0}  Age={1}", item.Name, item.Age);
    }
}
          
{
    Console.WriteLine("********************");
    var list = studentList.Where<Student>(s => s.Age < 30)
                            .Select(s => new
                            {
                                IdName = s.Id + s.Name,
                                ClassName = s.ClassId == 2 ? "高级班" : "其他班"
                            });
    foreach (var item in list)
    {
        Console.WriteLine("Name={0}  Age={1}", item.ClassName, item.IdName);
    }
}
{
    Console.WriteLine("********************");
    var list = from s in studentList
                where s.Age < 30
                select new
                {
                    IdName = s.Id + s.Name,
                    ClassName = s.ClassId == 2 ? "高级班" : "其他班"
                };

    foreach (var item in list)
    {
        Console.WriteLine("Name={0}  Age={1}", item.ClassName, item.IdName);
    }
}
{
    Console.WriteLine("********************");
    var list = studentList.Where<Student>(s => s.Age < 30)//条件过滤
                            .Select(s => new//投影
                            {
                                Id = s.Id,
                                ClassId = s.ClassId,
                                IdName = s.Id + s.Name,
                                ClassName = s.ClassId == 2 ? "高级班" : "其他班"
                            })
                            .OrderBy(s => s.Id)//排序

                            .OrderByDescending(s => s.ClassId)//倒排
                            .Skip(2)//跳过几条
                            .Take(3)//获取几条
                            ;
    foreach (var item in list)
    {
        Console.WriteLine($"Name={item.ClassName}  Age={item.IdName}");
    }
}
{//group by
    Console.WriteLine("********************");
    var list = from s in studentList
                where s.Age < 30
                group s by s.ClassId into sg
                select new
                {
                    key = sg.Key,
                    maxAge = sg.Max(t => t.Age)
                };
    foreach (var item in list)
    {
        Console.WriteLine($"key={item.key}  maxAge={item.maxAge}");
    }
    //group by new {s.ClassId,s.Age}
    //group by new {A=s.ClassId>1}
}
{
    Console.WriteLine("********************");
    var list = studentList.GroupBy(s => s.ClassId).Select(sg => new
    {
        key = sg.Key,
        maxAge = sg.Max(t => t.Age)
    });
    foreach (var item in list)
    {
        Console.WriteLine($"key={item.key}  maxAge={item.maxAge}");
    }
}
List<Class> classList = new List<Class>()
    {
        new Class()
        {
            Id=1,
            ClassName="初级班"
        },
        new Class()
        {
            Id=2,
            ClassName="高级班"
        },
        new Class()
        {
            Id=3,
            ClassName="微信小程序"
        },
    };
{
    var list = from s in studentList
                join c in classList on s.ClassId equals c.Id
                select new
                {
                    Name = s.Name,
                    CalssName = c.ClassName
                };
    foreach (var item in list)
    {
        Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");
    }
}
{
    var list = studentList.Join(classList, s => s.ClassId, c => c.Id, (s, c) => new
    {
        Name = s.Name,
        CalssName = c.ClassName
    });
    foreach (var item in list)
    {
        Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");
    }
}
{//左连接
    var list = from s in studentList
                join c in classList on s.ClassId equals c.Id
                into scList
                from sc in scList.DefaultIfEmpty()//
                select new
                {
                    Name = s.Name,
                    CalssName = sc == null ? "无班级" : sc.ClassName//c变sc,为空则用
                };
    foreach (var item in list)
    {
        Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");
    }
    Console.WriteLine(list.Count());
}
{
    var list = studentList.Join(classList, s => s.ClassId, c => c.Id, (s, c) => new
    {
        Name = s.Name,
        CalssName = c.ClassName
    }).DefaultIfEmpty();//为空就没有了
    foreach (var item in list)
    {
        Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");
    }
    Console.WriteLine(list.Count());
}
#endregion

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

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
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
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
C#委托和事件
0\.前言事件和委托是C中的高级特性,也是C中很有意思的一部分。出现事件的地方,必然有委托出现;而委托则不一定会有事件出现。那为什么会出现这样的关系呢?这就需要从事件和委托的定义出发,了解其中的内在。1\.委托说起委托,就不得不回忆一下之前在Linq篇中介绍的匿名方法,其中提到了Func和Action这两个类型
Wesley13 Wesley13
2年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这