C#基础知识学习——lambda 、Linq (二十)

lambda

lambda 声明运算符 => 从其主体中分离 lambda 参数列表。 若要创建 Lambda 表达式,需要在 Lambda 运算符左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。

通过Lambda表达式的方式创建Func和Action

           Action<string, int> action = (string name, int age) =>
            {
    
    
                Console.WriteLine($"lambda 无返回值方法 参数为{
      
      name}---{
      
      age}");
            };
            action.Invoke("dsgs", 56);

            Func<string, int, string> func1 = (name, age) =>
            {
    
    
                return $"lamdba 有返回值方法  参数为{
      
      name}----{
      
      age}";
            };
            var resu = func1.Invoke("过热时", 55);
            Console.WriteLine(resu);


            //在lambda中一个参数情况下,()可以省略
            Func<string, bool> func2 = des =>
            {
    
    
                return true;
            };

委托绑定方法

       {
    
    
           Action action1 = Demo1;
            action1.Invoke();

            Func<string, int, string> func3 = Demo;
            var result = func3.Invoke("非但不能", 88);
            Console.WriteLine(result);
       }
       public static void Demo1()
        {
    
     
        
        Console.WriteLine("调用方法一");
        }
        public static string Demo(string name,int age)
        {
    
    
            return $"调用===》Demo方法 参数为{
      
      name}==={
      
      age}";
        }

Linq

Linq是一种对集合、数据源的集成式查询方式,它是对IEnumerable的扩展方法集,所以想要使用Linq的话,需要引用两个命名空间 System.Linq和System.Linq.Expressions
Linq查询是一种延迟查询,当返回类型是一个IEnumerable的时候不会立即返回结果,必须调用ToList才能获取到实际查询结果,ToList返回的是一个不可变的List集合。

linq sql语法区别

  // sql语法 select id,name.gender,age from tb-student where id=20;
 //linq语法 from ...in...select
IEnumerable<int> result5=from i in ints select i;
 IEnumerable<int> result6 = from i in ints where i>50 select i;

对象操作方式

举个栗子

     public class Student
        {
    
    
            public int? Id {
    
     get; set; }
            public string Name {
    
     get; set; }
            public string  Gender {
    
     get; set; }
            public int? Age {
    
     get; set; }
        }

           var type=typeof(Student);
           var props=type.GetProperties();
           var resul= props.Where(a => !a.Name.Equals("Id")).Select(a => a.Name);
            Console.Write(String.Join(",", resul));

常见方法

准备数据集合
IEnumerable ints = new List() { 36,56,89,88,90,40};

  public class Student
    {
    
    
        public int? StuId {
    
     get; set; }
        public string? StuName {
    
     get; set; }
        public int? StuAge {
    
     get; set; }
        public string? StuGender {
    
     get; set; }
        public DateTime? StuBirthday {
    
     get; set; }
    }
     public class Exame
    {
    
    
        public int? StuId {
    
     get; set; }
        public int? Grade {
    
     get; set; }
    }
{
    
    
       static Random random = new Random();
        public static List<Student> LSStudents = new List<Student>();
        public static List<Exame> LSexames = new List<Exame>();
        {
    
    
string gender;
            for (int i = 0; i < 8; i++)
            {
    
    
                if (i%2==0)
                {
    
    
                    gender = "女";
                }
                else
                {
    
    
                    gender = "男";
                }
                int ID = random.Next(0, 20);
                LSStudents.Add(new Student {
    
     StuId = ID, StuAge = random.Next(18, 25), StuBirthday = DateTime.Now.AddYears(-random.Next(0, 3)), StuName = $"Stu{
      
      i}", StuGender = gender });;
                LSexames.Add(new Exame {
    
     StuId= ID ,Grade=random.Next(80,100)});
            }
}
}

Where

  //lambda
  IEnumerable<int> result = ints.Where(i => i > 50);
  //linq
  IEnumerable<int> result6 = from i in ints where i>50 select i;
    //筛选
            var result7 = LSStudents.Where(stu=> stu.StuAge>20).ToList();

Count

 var result1 = ints.Count(i => i > 50);

First

 Student student= LSStudents.First();//等同于LSStudents[0]
            Student student1 = LSStudents.First(s=>s.StuGender.Equals("女"));

Last

Student student2 = LSStudents.Last();
            Student student3 = LSStudents.Last(s => s.StuGender.Equals("女"));

Any、All

 bool b1 = LSStudents.Any();//是否包含元素
 //是否有年龄大于22岁的
  bool b2 = LSStudents.Any(s => s.StuAge > 22);

 bool b3 = LSStudents.All(s => s.StuAge > 15);
 bool b4 = LSStudents.All(s => s.StuAge > 22);

Skip、SkipWhile

 //不保留前三个对象
            List<Student> LSStu = LSStudents.Skip(3).ToList();
            ///排除集合刚开始遇到符合条件的对象
            List<Student> LSStu1 = LSStudents.SkipWhile(s=>s.StuGender.Equals("女")).ToList();

Take

 var result13 = LSStudents.Skip(5).Take(2).ToList();

Select

           //获取所有数字个位数的数字
            IEnumerable<int> result3 = ints.Select(i => i % 10);
            //将结果组合成新的元素集合
            var result4 = ints.Where(i => i > 60).Select(i=>$"数据大于60===={
      
      i}");
            IEnumerable<int> result5=from i in ints select i;

选出匿名对象

 //选出匿名对象
            var result11 = LSStudents.Select(s => new {
    
     id = s.StuId, name = s.StuName,age=s.StuAge }).ToList();
            foreach (var item in result11)
            {
    
    
                Console.WriteLine($"{
      
      item.name}----{
      
      item.age}");
            }

生成指定对象

  public class SeleteClass
    {
    
    
        public int? id {
    
     get; set; }
        public int? age {
    
     get; set; }
        public string? Name {
    
     get; set; }
    }
            //生成特定对象
            List<SeleteClass> result12 = LSStudents.Select(s => new SeleteClass {
    
     id = s.StuId, Name = s.StuName ,age=s.StuAge}).ToList();

GroupBy 分组

  var result8 = LSStudents.GroupBy(stu=>stu.StuGender).ToList();

OrderBy 升序

var result9 = LSStudents.OrderBy(stu => stu.StuId).ToList(); 

OrderByDescending 降序

var result10 = LSStudents.OrderByDescending(stu => stu.StuId).ToList();

Sum

 var result2 = ints.Sum();
 int? sumage = LSStudents.Select(s => s.StuAge).Sum();

Min

 int? minage = LSStudents.Select(s => s.StuAge).Min();

Max

 int? maxage = LSStudents.Select(s => s.StuAge).Max();

Average

double? average = LSStudents.Select(s => s.StuAge).Average();

Count

 int count= LSStudents.Count();
 int count1= LSStudents.Count(s=>s.StuGender.Equals("女"));

Contains

  Student student0 = new Student();
  Student student4 = LSStudents[2];
  bool b5 = LSStudents.Contains(student4);
  bool b6 = LSStudents.Contains(student0);

演示

Where

//流式查询
                var results = LSStudents.Where(s => s.StuGender.Equals("男"));
                //表达式查询
                var result19 = from s in LSStudents where s.StuGender.Equals("男") select s;

StartsWith

   //流式查询
  var resu = LSStudents.Where(s => s.StuName.StartsWith("S"));
 //表达式查询
 var result20 = from s in LSStudents where s.StuName.StartsWith("S") select s;

GroupBy

 //流式查询
 var resu = LSStudents.GroupBy(s=>s.StuGender);
//表达式查询
var resull = from s in LSStudents group s by s.StuGender;

GroupBy、Select、Average

//查询平均年龄
                //流式查询
                var resu = LSStudents.GroupBy(s => s.StuGender).Select(s=>new {
    
    gender=s.Key,average=s.Average(p=>p.StuAge) }); ;
                //表达式查询
                var resull = from s in LSStudents group s by s.StuGender into n select new {
    
     gender=n.Key,average=n.Average(t=>t.StuAge)};

OrderByDescending

var resut = LSStudents.OrderByDescending(s => s.StuAge);
var resul = from s in LSStudents orderby s.StuAge descending select s;

OrderBy、ThenBy

 var resut = LSStudents.OrderBy(t => t.StuAge).ThenBy(t => t.StuName);
 var results=from s in LSStudents orderby s.StuAge,s.StuName select s;

join 、Where、select 、new (筛选特定条件信息)

 //连表查询--条件查询
                {
    
    
                    //流式查询
                    Console.WriteLine("----流式查询-----");
                    var resu = LSStudents.Join(LSexames, s => s.StuId, e => e.StuId, (s, e) => new
                    {
    
    
                        name = s.StuName,
                        grade = e.Grade,
                        gender = s.StuGender
                    }).Where(n => n.gender.Equals("女"));

                    foreach (var item in resu)
                    {
    
    
                        Console.WriteLine($"{
      
      item.name}---{
      
      item.grade}---{
      
      item.gender}");
                    }
                    //表达式查询
                    Console.WriteLine("----表达式查询-----");
                    var query = from s in LSStudents
                                join c in LSexames on s.StuId equals c.StuId
                                where .StuGender.Equals("女")
                                select (new {
    
     name = s.StuName, grade = c.Grade, gender = s.StuGender }) ;
                    foreach (var item in query)
                    {
    
    
                        Console.WriteLine($"{
      
      item.name}---{
      
      item.grade}---{
      
      item.gender}");
                    }
                }             
                

Join 、 group by、select into(按照特定条件进行分类)

//按照性别进行分类

 //流式查询
                    Console.WriteLine("----流式查询-----");
                    var resu = LSexames.Where(e => e.Grade>90).
                        Join(LSStudents, s => s.StuId, e => e.StuId, (e, s) => new {
    
     name = s.StuName,
                            grade = e.Grade, gender = s.StuGender }).GroupBy(t=>t.gender);
                    foreach (var item in resu)
                    {
    
    
                        Console.WriteLine($"{
      
      item.Key}----{
      
      item.Count()}");
                        foreach (var s in item)
                        {
    
    
                            Console.WriteLine($"{
      
      s.name}---{
      
      s.gender}---{
      
      s.grade}");
                        }
                    }
                    Console.WriteLine("----表达式查询-----");
                    var resul = from s in LSStudents
                                join e in LSexames on s.StuId equals e.StuId  
                                where e.Grade > 90
                                select  (new {
    
    
                                    name = s.StuName,
                                    grade = e.Grade,
                                    gender = s.StuGender
                                }) into g  group g by g.gender;
                                
                    foreach (var item in resu)
                    {
    
    
                        Console.WriteLine($"{
      
      item.Key}----{
      
      item.Count()}");
                        foreach (var s in item)
                        {
    
    
                            Console.WriteLine($"{
      
      s.name}---{
      
      s.gender}---{
      
      s.grade}");
                        }
                    }

Join 、 group by、select into、Max、Average


                    //流式查询
                    var resut = LSexames.Join(LSStudents, e => e.StuId, s => s.StuId, (e, s) => new {
    
     e.Grade, s.StuGender, s.StuName, s.StuBirthday, s.StuAge })
                        .GroupBy(t => t.StuGender).Select(t => new
                        {
    
    
                            gender = t.Key,
                            maxage = t.Max(r => r.StuAge),
                            minage = t.Min(t => t.StuAge),
                            maxgrade = t.Max(r => r.Grade),
                            mingrade = t.Min(r => r.Grade),
                            average = t.Average(r => r.StuAge),
                            Avergrade = t.Average(r => r.StuAge)
                        }).GroupBy(n=>n.gender);
                    Console.WriteLine("----流式查询-----");
                    foreach (var itm in resut)
                    {
    
    
                        Console.WriteLine(itm.Key);
                        foreach (var item in itm)
                        {
    
    
                            Console.WriteLine($"average:{
      
      item.average}----maxgrade:{
      
      item.maxgrade}----mingrade:{
      
      item.mingrade}----Avergrade:{
      
      item.Avergrade}");
                        } 
                    }

                    //表达式查询
                    Console.WriteLine("----表达式查询-----");
                    var re = from s in LSStudents join e in LSexames on s.StuId equals e.StuId
                             let n = new {
    
     e.Grade, s.StuGender, s.StuName, s.StuBirthday, s.StuAge } group n by n.StuGender into nw
                             let nww = new {
    
    
                                 gender = nw.Key,
                                 maxage = nw.Max(r => r.StuAge),
                                 minage = nw.Min(t => t.StuAge),
                                 maxgrade = nw.Max(r => r.Grade),
                                 mingrade = nw.Min(r => r.Grade),
                                 average = nw.Average(r => r.StuAge),
                                 Avergrade = nw.Average(r => r.StuAge)
                             } group nww by nww.gender;
                    foreach (var itm in re)
                    {
    
    
                        Console.WriteLine(itm.Key);
                        foreach (var item in itm)
                        {
    
    
                            Console.WriteLine($"average:{
      
      item.average}----maxgrade:{
      
      item.maxgrade}----mingrade:{
      
      item.mingrade}----Avergrade:{
      
      item.Avergrade}");
                        }
                    }

猜你喜欢

转载自blog.csdn.net/weixin_45496521/article/details/130624520