杨中科 .netcore Linq 。一前期准备知识

ops/2024/10/16 0:10:55/

为什么要学Linq

一、为什么要学LINQ?

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

var items=s.Where(c =>char.lsLetter(c))//过滤非字母
.Select(c=>char.ToLower(c))//大写字母转换为小写
.GroupBy(c =>c)//根据字母进行分组
.Where(g=>g.Count()>2)//过滤掉出现次数<=2.O
.rderByDescending(g =>g.Count())//按次数排序
.Select(g=>new { char=g.Key,Count=g.Count()})

推演过程

委托→lambda→LINQ

IsOK(int i)
{return i>3&&<10;
}items.Where(lsOk);items.Where(i=>i>3&&<10);

(复习)委托

1、委托是可以指向方法的类型,调用委托变量时执行的就是变量指向的方法举例。

在这里插入图片描述
委托指向一个方法
在这里插入图片描述
运行结果
在这里插入图片描述

自定义委托声明时,返回值、参数类型、参数数量要与被委托的方法一致
在这里插入图片描述

调用
在这里插入图片描述
运行结果
在这里插入图片描述

2、.NET 中定义了泛型委托Action(无返回值)和Func(有返回值),所以一般不用自定义委托类型。举例。
Action
在这里插入图片描述

Func

在这里插入图片描述
使用Action指向F1()
在这里插入图片描述
运行结果
在这里插入图片描述
转到Action 的方法定义,发现就是没有参数,没有返回值的委托声明
在这里插入图片描述
使用Func<>有返回值委托 指向Add 方法
在这里插入图片描述
运行结果
在这里插入图片描述
转到方法定义
在这里插入图片描述

二、lambda 是怎么来的

委托变量不仅可以指向普通方法还可以指向匿名方法

第一节中,指向的都是有名字的方法(F1,F2 ,Add)

Func<int, int, string>f1= delegate
(int i1, int i2){return $"{i1}+{i2}={i1 + i2}";string s = f1(1,2);

示例:

没有参数,没有返回值的匿名方法

在这里插入图片描述

运行结果
在这里插入图片描述

有参数、没有返回值的匿名方法

委托必须根据传入参数类型,声明泛型变量
在这里插入图片描述

运行结果
在这里插入图片描述

带参数、有返回值的匿名方法

在这里插入图片描述

运行结果
在这里插入图片描述

匿名方法可以写成lambda表达式

省略掉了delegate 加上了 =>

Func<int, int, string> f1 =(i1,i2)=>return {
$"{i1}+{i2}={i1 + i2}";
};

可以省略参数数据类型,因为编译能根据委托类型推断出参数的类型用=>引出来方法体。

示例:
在这里插入图片描述
运行结果
在这里插入图片描述

可以省略参数类型
在这里插入图片描述
运行结果
在这里插入图片描述

如果委托没有返回值,且方法体只有一行代码,可省略{}

Action<int, string> a1 =(age, name)=> 
Console.WriteLine($"年龄{age}姓名{name}");
a1(18, "yzk");

示例:
在这里插入图片描述
运行结果
在这里插入图片描述

如果=>之后的方法体中只有一行代码,且方法有返回值,那么可以省略方法体的{}以及return。

return和{}要同时去掉,否则编译器会报错

Func<int, int, string> f1 =(i1,i2)=>
$"{i1}+{i2}={i1 + i2}";

示例:
在这里插入图片描述

如果只有一个参数,参数的()可以省略。

Action<string> f1 = s => Console.WriteLine(s);
Func<int, bool> f2 = i => i > 5;

反推回去

示例:
在这里插入图片描述
运行结果
在这里插入图片描述
有返回值
在这里插入图片描述

三、解密Linq 方法的背后

LINQ中提供了很多集合的扩展方法,配合lambda能简化数据处理。

int[] nums = new int[] {3,99,88,77,7,8,9,66,15,7};
lEnumerable<int> items =nums.Where(i=>i>10);//usingSystem.Ling;

示例:

在这里插入图片描述
运行结果,打印数组中所有大于10的数
在这里插入图片描述
where方法会遍历集合中每个元素,对于每个元素都调用a=>a>10这个表达式,判断一下是否为true。如果为true,则把这个放到返回的集合中。
类似于where中 传入一个 匿名lambda方法
在这里插入图片描述

自定义Linq方法

1.不使用扩展方法

在这里插入图片描述
调用
在这里插入图片描述
运行结果
在这里插入图片描述

2.使用yeild方式

在这里插入图片描述

调用
在这里插入图片描述
运行结果
在这里插入图片描述

可以使用var让编译器的“类型推断’来简化类型的声明。
在LINQ中常用
C#的var和JavaScript的var不一样,仍然是强类型的。
(*)C#中的弱类型是dynamic。

在这里插入图片描述


http://www.ppmy.cn/ops/126183.html

相关文章

Qt 每日面试题 -8

71、了解Qt的QPointer吗? QPointer只能用于指向QObject及派生类的对象。 当一个QObject或派生类对象被删除后&#xff0c;QPointer能自动将其内部的指针设置为0 &#xff0c;这样在使用QPointer之前就可以判断一下是否有效。QPointer对象超出作用域时&#xff0c;并不会删除它…

Linux:进程控制(三)——进程程序替换

目录 一、概念 二、使用 1.单进程程序替换 2.多进程程序替换 3.exec接口 4.execle 一、概念 背景 当前进程在运行的时候&#xff0c;所执行的代码来自于自己的源文件。使用fork创建子进程后&#xff0c;子进程执行的程序中代码内容和父进程是相同的&#xff0c;如果子进…

Ubuntu+CLion+OpenCV+NCNN+Squeezenet 从源码编译到代码输出全流程记录

✨博客主页&#xff1a;王乐予&#x1f388; ✨年轻人要&#xff1a;Living for the moment&#xff08;活在当下&#xff09;&#xff01;&#x1f4aa; &#x1f3c6;推荐专栏&#xff1a;【图像处理】【千锤百炼Python】【深度学习】【排序算法】 目录 &#x1f63a;一、引言…

P1001 | 禾木切西瓜

P1001 | 禾木切西瓜 题目描述 酷热的夏天&#xff0c;禾木从冰箱中拿出一只西瓜&#xff0c;想要将它一分为二&#xff0c;用勺子舀着吃&#xff0c;但作为一个资深的吃货&#xff0c;禾木认为一只好西瓜&#xff0c;一分为二后&#xff0c;两部分的重量都应该为偶数。 例如一…

在 Jupyter Notebook 中,无法看到特定 Conda 环境的内核

问题概述 在 Jupyter Notebook 中&#xff0c;无法看到特定 Conda 环境的内核&#xff0c;导致无法在该环境下运行代码。这通常是由于内核未正确注册到 Jupyter 所致。 常见原因 未安装 ipykernel&#xff1a;每个 Conda 环境需要安装 ipykernel 才能作为 Jupyter 内核使用。…

【鱼类识别】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面+TensorFlow

一、介绍 鱼类识别系统。使用Python作为主要编程语言开发&#xff0c;通过收集常见的30种鱼类&#xff08;‘墨鱼’, ‘多宝鱼’, ‘带鱼’, ‘石斑鱼’, ‘秋刀鱼’, ‘章鱼’, ‘红鱼’, ‘罗非鱼’, ‘胖头鱼’, ‘草鱼’, ‘银鱼’, ‘青鱼’, ‘马头鱼’, ‘鱿鱼’, ‘鲇…

面试22222

好的&#xff0c;我会逐步解释这些面试问题&#xff0c;并给出一些应答建议。我们先从第一个问题开始&#xff1a; 1. 介绍一下你的学术背景和工作经验&#xff0c;以及为什么对生物信息学感兴趣。 回答思路&#xff1a; 首先简单概述你的学术背景&#xff0c;比如你的专业、…

怎么快速定位bug?怎么编写测试用例?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 作为一名测试人员如果连常见的系统问题都不知道如何分析&#xff0c;频繁将前端人员问题指派给后端人员&#xff0c;后端人员问题指派给前端人员&#xff0c;那么在…