当前位置: 首页 > article >正文

C#学习 深入理解委托、匿名方法、Lamda表达式、Linq;

目录

一.委托 

1.1 什么是委托 

1.2 委托的使用

二.匿名方法和Lamda表达式 

2.1 什么是匿名方法 

2.2 Lambda表达式

三.Linq 

3.1 Linq理解 

3.2 Linq的扩展方法

一.委托 

1.1 什么是委托 

委托和类一样,是具有特定参数列表和返回值类型的方法函数的引用,在实例化委托时可以将实例化委托和兼容签名和返回值类型的方法相关联,从而使用该委托回调该方法;

      1.2 委托的使用

委托可以在类的外面和类的里面进行声明方法,一般用delegate关键字进行声明,如下;

<访问修饰符>   delegate <返回值类型>  方法名或者叫自定义委托名 (返回参数)

private delegate void method(int a);

同时也可以使用Action和Func进行内联声明,其中Action是返回值为空,0-16的任何参数的方法的声明;Func任何一个返回值的,0-16的任何参数的方法的声明;

 Action f1 = (int i, int j) => i * j;
  Func<int,int,int> f11 = (i, j) => { 
      return i+j; 
  };

二.匿名方法和Lamda表达式 

2.1 什么是匿名方法 

匿名方法以内联的方式将方法放入委托使用对象的位置,也就是委托调用匿名的方法,将委托实例和方法体代码关联,这样减少重复的代码编写,如将方法名匿名不写,提升了代码的精简;

匿名方法的声明:delegate(方法参数)=> {方法体}

   Action f1 = delegate ()
   {
       Console.WriteLine("我是AAA");
   };

       2.2 Lambda表达式

Lambda表达式本质上还是委托,为C#提供了更加简洁的语法,同时也为Linq提供了语法基础;

Lambda表达式语法:

  • 多种参数多条语句:(参数)=>{函数体}
   Func<int,int> test1 = (i, j) =>
   {
       if (i > j)
       {
           Console.WriteLine(i + "比" + j + "大");
       }
       else
       {
           Console.WriteLine(i + "比" + j + "小")
       }
   }
  • 多条参数单条语句:(参数)=>函数体
//多条参数单条语句:(参数)=>函数体
Func<string, string> test3 = (i, j) => i + j;
  • 单条语句多条语句:参数=>{函数体}
​
    //多条参数单条语句:(参数)=>函数体
    Func<string> test2 = i =>
    {
        if(Empty(i))
        {
            Console.WriteLine("为空");
        }
    }

​
  • 单条语句单条语句:参数=>函数体

  //单条语句单条语句:参数 => 函数体
  Action<int> test4=i=>Console.Write(i);

三.Linq 

3.1 Linq理解 

Linq(语言集成查询)提供了语言的查询功能以及高阶函数的API,Linq可以用最少的代码对数据源执行筛选、排序和分组操作。 可使用相同的基本查询表达式模式来查询和转换 SQL 数据库、ADO .NET 数据集、XML 文档和流以及 .NET 集合中的数据。

其中Lambda表达式和Linq并没有太大关联,两者只是只是相互关联嵌套使用;

3.2 Linq的扩展方法

  • Any()方法:判断是否有一条数据
List list=new List();
list.Add(1);
bool b=list.Any(a => a > 0);
bool b = list.where(a => a > 0).any();
  • 获取一条数据(是否带参数的两种写法):

Single:有且只有一条满足要求的数据;

SingleOrDefault():最多只有一条满足要求的数据;

First():至少有一条,返回第一条;

FirstOrDefault():返回第一条或者返回默认值;

  • 多规则排序

 可以在Order()、OrderByDescending()后继续写ThenBy()、ThenByDescending(). 

例如优先按照Age排序,如果Age相同再按照Salary排序;

 List<Employee> list=new List<Employee>();
 list.Add(new Employee{Id=1,Name="xiao1",Gender=true,Age=20,Salary=20023});
 list.Add(new Employee{Id=2,Name="xiao2",Gender=false,Age=21,Salary=2010});
 list.Add(new Employee{Id=3,Name="xiao3",Gender=true,Age=22,Salary=20110});
 list.Add(new Employee{Id=4,Name="xiao4",Gender=true,Age=49,Salary=2001});

 list.OrderBy(e => e.Age).ThenByDescending(e => e.Salary);

千万不能Order()、OrderByDescending()同时使用,例如:

   list.OrderBy(e => e.Age).OrderByDescending(e => e.Salary);
  •  限制结果集,获取部分数据

skip(n):跳过N条数据

take(n):获取N条数据

例如:从第一条开始获取第二条数据

 List<Employee> list=new List<Employee>();
 list.Add(new Employee{Id=1,Name="xiao1",Gender=true,Age=20,Salary=20023});
 list.Add(new Employee{Id=2,Name="xiao2",Gender=false,Age=21,Salary=2010});
 list.Add(new Employee{Id=3,Name="xiao3",Gender=true,Age=22,Salary=20110});
 list.Add(new Employee{Id=4,Name="xiao4",Gender=true,Age=49,Salary=2001});
 var list1 = list.Skip(1).Take(2);

 分组  GroupBy():

GroupBy()方法参数是分组条件表达式,  返回值为IGrouping<TKey, TSource>类型的泛型 IEnumerable,也就是每一组以一个 IGrouping对象的形式返回。IGrouping是一 个继承自IEnumerable的接口,IGrouping中 Key属性表示这一组的分组数据的值。 例子:根据年龄分组,获取每组入数、最高工资、平均工资。用var简化编程。

Enumerable本质上他也是集合

投影:

 把集合中的每一项转换为另外一种类型。

IEnumerable<int> ages = list.Select(e => e.Age);

Enumerable<string>; names = list.Select(e=>e.Gender?"男":"女");

var dogs = list.Select(p=>new Dog(NickName=e.Name,Age=e.Age));

 

例题:

统计一个字符串中每个字母出 现的频率(忽略大小写),然后按照从高到低的顺序输出,出现频率高于2次的单词和其出现的频率:  

 

 


http://www.kler.cn/a/301037.html

相关文章:

  • 【PCIe 总线及设备入门学习专栏 5.3 -- PCIe PHY firmware load | trainning | link up 区别与联系】
  • 浅谈云计算02 | 云计算模式的演进
  • Docker的入门
  • 代码随想录算法训练营第十二天|第18题. 四数之和
  • (三)html2canvas将HTML 转为图片并实现下载
  • VM(虚拟机)和Linux的安装
  • 【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)
  • 点亮第一盏LED灯 2),stm32CubeMX在线导入F103C8T6芯片包
  • Three 渲染器(二)
  • 如何将Windows风格的剪切和粘贴添加到Mac访达中
  • springboot配置多数据源
  • MySQL record 03 part
  • 第67期 | GPTSecurity周报
  • 简单的 Fortran 程序示例
  • C语言蓝桥杯:语言基础
  • c/c++面试100道
  • 工厂安灯系统在设备管理中的重要性
  • 怎么利用XML发送物流快递通知短信
  • 引领智能家居新风尚,WTN6040F门铃解决方案——让家的呼唤更动听
  • 公开数据库下载2-药敏性、综合类(TCGA、COSMIC、UCSC、GATK、cBioPortal)
  • 虚拟机安装VMware-tools详细教程
  • Telegram miniApp开发(三)
  • 从测绘资质角度看郑州市地理信息产业发展现状与前景
  • css flex与inline-flex的区别
  • Excel图片批量插入单元格排版处理插件【图片大师】
  • 【Linux 从基础到进阶】Ansible自动化运维工具使用