zoukankan      html  css  js  c++  java
  • C# lambda 和 Linq

    本章节给大家带来的是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
    
    }

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

    二、Linq

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

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

  • 相关阅读:
    sql mdf文件被破坏,ldf完好的情况下恢复数据库
    网站开发人员应该知道的61件事
    Myeclipse6.5中安装maven
    Java常用的一些正则表达式验证
    jQuery中$.ajax()方法中参数详解
    Pro Silverlight 3 in C# Layout
    Pro Silverlight 3 in C# XAML
    bugtracker.net 3.4.0 简易汉化手记+汉化文件下载
    IBatisNet In 参数配置方法
    Pro Silverlight 3 in C# XAML Resources
  • 原文地址:https://www.cnblogs.com/Ramon-Zeng/p/10271938.html
Copyright © 2011-2022 走看看