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

为什么要学Linq

一、为什么要学LINQ?

让数据处理变得简单:

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

csharp 复制代码
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

csharp 复制代码
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)

csharp 复制代码
Func<int, int, string>f1= delegate
(int i1, int i2){return $"{i1}+{i2}={i1 + i2}";

string s = f1(1,2);

示例:

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

运行结果

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

委托必须根据传入参数类型,声明泛型变量

运行结果

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

运行结果

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

省略掉了delegate 加上了 =>

csharp 复制代码
Func<int, int, string> f1 =(i1,i2)=>return {
$"{i1}+{i2}={i1 + i2}";
};

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

示例:

运行结果

可以省略参数类型

运行结果

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

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

示例:

运行结果

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

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

csharp 复制代码
Func<int, int, string> f1 =(i1,i2)=>
$"{i1}+{i2}={i1 + i2}";

示例:

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

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

反推回去

示例:

运行结果

有返回值

三、解密Linq 方法的背后

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

csharp 复制代码
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。

相关推荐
A^mber2 天前
基于.NetCore 的 AI 识别系统的设计与实现
人工智能·.netcore
ccc_9wy2 天前
Apache Solr RCE(CVE-2017-12629)--vulhub
apache·solr·lucene·burp suite·vulhub·远程命令执行漏洞rce·cve-2017-12629
ccc_9wy2 天前
Apache Solr RCE(CVE-2019-0193)--vulhub
网络安全·apache·solr·lucene·vulhub·cve-2019-0193·远程命令执行漏洞rce
“抚琴”的人2 天前
C#—LINQ详解及汇总
开发语言·c#·linq
Rverdoser3 天前
Spring Boot 配置Kafka
c#·linq
Jeffrey~~4 天前
.Net_比对Json文件是否一致
c#·json·.net·.netcore
吳所畏惧4 天前
C#轻松实现Winform监控文件夹变化以及监控文件新增、修改、删除、重命名等操作保姆级详细教程
开发语言·windows·c#·.net·.netcore
CS软件开发框架4 天前
C/S软件授权注册系统-轻量级WebApi服务器介绍
运维·服务器·visualstudio·c#·.net·.netcore
网络安全-杰克5 天前
Apache solr XML 实体注入漏洞
xml·apache·solr
鸠摩智首席音效师5 天前
如何使用 Docker 容器化 .NET Core 应用程序 ?
docker·容器·.netcore