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

embedded/2024/9/19 22:03:35/ 标签: c#, 学习, 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.ppmy.cn/embedded/112990.html

相关文章

如何解决“json schema validation error ”错误? -- HarmonyOS自学6

一. 问题描述 DevEco Studio工程关闭后&#xff0c;再重新打开时&#xff0c;出现了如下错误提示&#xff1a; json schema validation error 原因&#xff1a; index.visual或其他visual文件中的left等字段的值为负数时&#xff0c;不能以”-0.x“开头&#xff0c;否则就会…

Mastering openFrameworks_第十一章_网络

网络 网络为多个设备之间的数据交换提供了一种方式。它是一个主要组成部分,允许远程控制移动和平板设备应用程序中的一些参数,也用于使交互式项目在多台计算机上同步工作。在本章中,您将学习如何在openFrameworks项目中实现和使用OSC和TCP协议,具体如下: 网络基础 使用O…

openCV的python频率域滤波

在OpenCV中实现频率域滤波通常涉及到傅里叶变换(Fourier Transform)和其逆变换(Inverse Fourier Transform)。傅里叶变换是一种将图像从空间域转换到频率域的数学工具,这使得我们可以更容易地在图像的频域内进行操作,如高通滤波、低通滤波等。 下面,我将提供一个使用Py…

MySQL权限管理(DCL)总结

黑马程序员老师讲的非常好 第一个用户管理偏向于开发人员 第二个权限控制偏向于管理人员 但是怎么说呢&#xff0c;你毕竟学mysql了&#xff0c;都得学一学吧。只有精通&#xff0c;实力到位&#xff0c;才能被别人所认可&#xff01;

Linux云计算 |【第三阶段】PROJECT1-DAY1

主要内容&#xff1a; 服务器硬件&#xff08;RAID磁盘阵列、IDRAC远程控制卡&#xff09;、部署LNMP动态网站&#xff08;部署LNMP平台、上线Wordpress代码、创建数据库、初始化Wordpress&#xff09; 一、服务器介绍 1、什么是服务器 服务器&#xff08;Server&#xff09…

本地部署大语言模型详细操作步骤

本地部署大语言模型&#xff0c;尤其是像我这样的基于中文开源项目的大模型&#xff0c;涉及的步骤相对复杂&#xff0c;需要一定的技术背景。下面我将详细阐述整个流程&#xff1a; 环境准备&#xff1a; 硬件准备&#xff1a;大语言模型通常需要高性能的计算资源&#xff0c;…

一个关于Excel的段子

一个关于Excel的段子。南昌有个批发大市场&#xff0c;里面很多卖衣服的。朋友的女朋友就在一家这样的公司&#xff0c;有57家门店&#xff08;江西和湖北&#xff09;&#xff0c;一年的营业额接近1亿。利润多少俺不知道了&#xff0c;反正在数据库里看到很多进价不到30但是零…

详解BMP图片格式以及关于Verilog图像处理的仿真环境搭建

文章目录 一、BMP位图简介二、BMP格式分析2.1 如何用十六进制打开BMP图片2.2 头文件格式2.3 信息头格式2.4 调色板格式2.5 位图数据格式2.6 位图对齐方式三、Verilog图像处理的仿真环境搭建3.1 Verilog文件操作指令3.1.1 条件编译 (`` `ifdef``、 `` `else``、`` `endif``)3.1.…

[Unity Demo]重启项目之从零开始制作空洞骑士Hollow Knight第一集:导入素材以及建立并远程连接git仓库

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、导入素材二、使用步骤 1.建立并远程连接git2.github和仓库连接总结 前言 好久没来CSDN看看&#xff0c;突然看到前两年自己写的文章从零开始制作空洞骑士只…

kubesphare 学习尚硅谷

视频地址&#xff1a;https://www.bilibili.com/video/BV13Q4y1C7hS 文档地址&#xff1a;https://www.yuque.com/leifengyang/oncloud/gz1sls基于 kubernetes 构建的分布式、多租户、多集群、企业级开源容器平台&#xff0c;具有强大且完善的网络与存储能力&#xff0c;并通过…

使用ENVI之大气校正(上)

将下载好的遥感影像导入遥感影像处理软件ENVI 5.6中&#xff0c;使用ENVI 5.6的Toolbox中的FLAASH Atmospheric Correction工具 在跳出的FLAASH Atmospheric Correction Model Input Parameters界面中进行如下操作 并在跳出的界面中选择Use single scale factor for all ba…

【C语言】__attribute__((constructor)) 和 __attribute__((destructor))详细解析

__attribute__((constructor)) 和 __attribute__((destructor)) 是 GCC&#xff08;GNU Compiler Collection&#xff09;中的两个特殊属性&#xff0c;用于在程序初始化或终止时自动执行特定的函数。它们允许开发者控制函数在程序生命周期中的执行顺序。下面详细介绍其用法及优…

scrapy 爬取微博(三)【最新超详细解析】: 字段解释篇(微博内容、评论)

上一期介绍了用户相关的字段信息&#xff0c;这期介绍微博相关。 这个由于是我个人整理&#xff0c;可能会随着我程序的不断深度开发&#xff0c;把需要的字段不断加入进去&#xff0c;所以这个文章可能会更新&#xff0c;所以各位看官可以收藏一个 1 内容字段解释 字段名解释…

Java之线程篇四

目录 volatile关键字 volatile保证内存可见性 代码示例 代码示例2-&#xff08;volatile&#xff09; volatile不保证原子性 synchronized保证内存可见性 wait()和notify() wait()方法 notify() 理解notify()和notifyAll() wait和sleep的对比 volatile关键字 volati…

C++(C++的文件I/O)

一、C的文件IO 在C中把文件的读写操作都封装在标准库中&#xff0c;ifstream类主要用于读取文件内容&#xff0c;ofstream主要用于写入文件内容&#xff0c;fstream类可读可写。 打开文件操作&#xff1a; 1、使用构造函数打开文件 fstream(const char *filename, openmode…

类型转换等 面试真题

题目1 请问哪个结果为NaN A. 123null B. 123‘1’ C. 123/0 D. 123undefined 在这四个表达式中&#xff0c;只有D. 123 undefined 的结果是 NaN&#xff0c;原因如下&#xff1a; A. 123 null 结果是&#xff1a;123原因&#xff1a;null 在数值运算中会被自动转换为 0&a…

快速搭建最简单的前端项目vue+View UI Plus

1 引言 ‌‌Vue是一套用于构建Web前端界面的渐进式JavaScript框架。‌‌它以其易学易用、性能出色、灵活多变而深受开发者喜爱&#xff0c;并且与其他前端框架&#xff08;如‌React和‌Angular&#xff09;相比&#xff0c;在国内市场上受到了广泛的认可和使用。点击进入官方…

【系统架构设计师】单例模式(Singleton Pattern)

单例模式详解 1. 什么是单例模式? 单例模式(Singleton Pattern)是一种创建型设计模式,它的目的是确保一个类只有一个实例,并且为整个系统提供一个全局访问点。换句话说,单例模式会限制类的实例化次数,使得在整个应用程序运行期间,类只有一个对象实例。无论何时何地访…

有关NLog及中间件实现日志记录

NLog简介 NLog 是一个非常强大的日志记录库&#xff0c;广泛应用于 .NET 应用程序中。它支持多种日志目标&#xff08;如文件、数据库、控制台、远程服务器等&#xff09;&#xff0c;并且可以根据日志级别&#xff08;如 Trace、Debug、Info、Warn、Error、Fatal&#xff09;…

Cenos7镜像+Docker问题

前言 好用的镜像 阿里 curl -o /etc/yum.repos.d/Centos7-aliyun.repo https://mirrors.wlnmp.com/centos/Centos7-aliyun-x86_64.repo科大 curl -o /etc/yum.repos.d/Centos7-ustc.repo https://mirrors.wlnmp.com/centos/Centos7-ustc-x86_64.repo网易 curl -o /etc/yum…