杨中科 .netcore Linq常用的扩展方法

news/2024/10/15 11:14:05/

一、

LINQ中提供了大量类似Where的扩展方法,简化数据处理。大部分都在System.Linq命名空间中

基本是对于lEnumerable 接口的扩展方法。
数组、List、Dictionary、Set… 都是实现了 lEnumerable 接口。因此都是可以使用这些扩展方法。

准备初始数据

class Employee
{public long ld { get; set; }public string Name {get; set; }//姓名public int Age {get; set; }//年龄public bool Gender {get; set; }//性别public int Salary{get; set; }//月薪public override string ToString(){return$"ld={ld},Name={Name},Age={Age},Gender={Gender},Salary={Salary}";}}
List<Employee> list = new List<Employee>;
list.Add(new Employee {ld = 1, Name = "jerry", Age = 28, Gender = true, Salary = 5000 });
list.Add(new Employee {ld = 2, Name = "jim", Age = 33, Gender = true, Salary = 3000 });
list.Add(new Employee { ld = 3, Name = "lily", Age = 35, Gender = false, Salary = 9000 });
list.Add(new Employee {ld =4, Name ="lucy",Age = 16, Gender = false, Salary= 2000 });
list.Add(new Employee {ld=5,Name = "kimi",Age = 25,Gender = true, Salary = 1000 });
list.Add(new Employee {ld =6, Name = "nancy", Age = 35, Gender = false, Salary = 8000 });
list.Add(new Employee {ld=7,Name = "zack", Age = 35, Gender = true, Salary = 8500 });
list.Add(new Employee {ld = 8, Name = "jack", Age = 33, Gender = true, Salary = 8000 });

where 方法

Where方法:每一项数据都会经过predicate的测试,如果针对一个元素,predicate执行的返回值为true,那么这个元素就会放到返回值中。

Where参数是一个lambda表达式格式的匿名方法,方法的参数e表示当前判断的元素对象。参数的名字不一定非要叫e,不过一般lambda表达式中的变量名长度都不长。

传入一个过滤的lambda 表达式
在这里插入图片描述

source对哪个数据做过率,predicate 泛型委托(Tsource是传入数据类型,返回值是bool。判断参数是否满足过滤条件)

在这里插入图片描述

示例:

过滤年龄大于三十
在这里插入图片描述
运行结果

在这里插入图片描述

Count()方法

:获取数据条数
int count1 = list.Count(e =>e.Salary>5000 || e.Age < 30);
int count2 = list.Where(e =>e.Salary> 5000 || e.Age <30).Count();

源码:
在这里插入图片描述

示例:

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

Any()方法

:是否至少有一条数据满足条件
bool b1 = list.Any(e => e.Salary >8000);
bool b2 = list.Where(e =>e.Salary>8000).Any();
有可能比Count()实现效率高。any()获取到一条满足条件的数据就不会继续往下寻找。count需要查找所有满足条件的数据。

示例

在这里插入图片描述

获取一条数据(是否带参数的两种写法)

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

多条、一条满足条件的数据都没有,会抛出异常

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

运行结果:报错,这么序列中,含有多于一条数据。

在这里插入图片描述

示例2:取出只有一个满足条件的数据
在这里插入图片描述

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

示例3: 没有匹配结果,和直接在single中传入条件
在这里插入图片描述

运行结果:报错,没有匹配的元素
在这里插入图片描述

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

多条满足条件数据,会抛出异常。没有则返回默认值(int 0,string null)

示例1:有一条数据满足条件

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

在这里插入图片描述
示例2:一条满足条件的数据都没有的情况,返回默认值

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

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

多条返回第一条,一条没有会抛出异常

示例1:多条返回第一条
在这里插入图片描述

运行结果:
在这里插入图片描述
示例2:一个都没有的情况
在这里插入图片描述

运行结果:抛出异常
在这里插入图片描述

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

返回一条,一条都没有就返回默认值

选择合适的方法,“防御性编程”

排序:

Order()对数据正序排序;

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

示例:根据age 排序
在这里插入图片描述
运行结果:
在这里插入图片描述

OrderByDescending()倒序排序;

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

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

对于简单类型排序

示例:根据自己排序
在这里插入图片描述
运行结果:
在这里插入图片描述

特殊案例: 按照最后一个字符排序;
在这里插入图片描述

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

用Guid或者随机数进行随机排序。
在这里插入图片描述

多规则排序

可以在Order()、OrderByDescending()后继续写ThenBy()、ThenByDescending().
案例:优先按照Age排序,如果Age相同再按照Salary排序

list.OrderBy(e =>e.Age).ThenByDescending(e>e.Salary)千万不要写成
list.OrderBy(e => e.Age).OrderByDescending(e =>e.Salary)

示例

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

连续使用两次orderby,导致排序混乱
在这里插入图片描述

限制结果集,获取部分数据

:Skip(n)跳过n条数据,Take(n)获取n条数据。

案例:获取从第2条开始获取3条数据var orderedltems1 = list.Skip(2).Take(3)
Skip()、Take()也可以单独使用。

示例

在这里插入图片描述

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

聚合函数

:Max()、Min()、Average()、sum()、Count ().

LINQ中所有的扩展方法几乎都是针对IEnumerable接口的,而几乎所有能返回集合的都返回lEnumerable,所以是可以把几乎所有方法“链式使用”的。list.Where(e =>e.Age > 30).Min(e=>e.Salary)

示例:

在这里插入图片描述

年龄大于30,平均工资
在这里插入图片描述

分组:

GroupBy()方法参数是分组条件表达式,返回值为lGrouping<TKey,Tsource>类型的泛型IEnumerable,也就是每一组以一个IGrouping对象的形式返回。
lGrouping是一个继承自lEnumerable的接口,IGrouping中Key属性表示这一组的分组数据的值。

根据年龄分组
在这里插入图片描述

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

例子:根据年龄分组,获取每组人数、最高工资、平均工资。用var简化编程。
在这里插入图片描述

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

投影

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

lEnumerable<int> ages = list.Select(e =>e.Age);lEnumerable<string> names =list.Select(e=>e.Gender?"男":"女");var dogs = list.Select(p=>newDog{NickName=e.Name,Age=e.Age});

示例:

在这里插入图片描述

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

匿名类型:

var p = new {Name=“tom”,ld=1}
var p1 = new {name,ld=1,p.Age};

编译时,创建了一个匿名类型
在这里插入图片描述

通过反编译看匿名类型原理。
在这里插入图片描述
匿名类型,是编译器为我们生成的类型

var的高光时刻!

投影与匿名类型:

var items= list.Select(e=>new{e.Name,e.Age,XingBie=e.Gender?"男":'女"});var items = list.GroupBy(e =>e.Gender)
.Select(g=>new{ Gender=g.Key,Count=g.Count(),AvgSalary=g.Average(e => e.Salary),MinAge= g.Min(e =>e.Age)}
);

集合转换

:有一些地方需要数组类型或者List类型的变量,我们可以用ToArray()方法和ToList()分别把IEnumerable转换为数组类型和List类型

示例

在这里插入图片描述

链式调用

Where、Select、OrderBy、 GroupBy、Take、skip等返回值都是lEnumerable类型,所以可以链式调用。

例子:“获取ld>2的数据,然后按照Age分组,并且把分组按照Age排序然后取出前3条,最后再投影取得年龄人数、平均工资
在这里插入图片描述

查询语法

使用Where、OrderBy、Select等 扩展方法进行数据查询的写法叫做“LINQ方法语法”。
还有一种“查询语法”的写法。

var items2 = from e in list
where e.Salary>3000 orderby e.Age 
select new {e.Name,e.Age, Gender =e.Gender?"男":"女"};

http://www.ppmy.cn/news/1539401.html

相关文章

k8s集群版本升级

Kubernetes 集群版本升级是为了获得最新的功能、增强的安全性和性能改进。然而&#xff0c;升级过程需要谨慎进行&#xff0c;特别是在生产环境中。通常&#xff0c;Kubernetes 集群的版本升级应遵循逐步升级的策略&#xff0c;不建议直接跳过多个版本。 Kubernetes 版本升级的…

【Python库安装】Python环境安装气象地理常用库salem

【Python库安装】Python环境安装salem库 salem库概述Anaconda创建环境下载基础安装包 1 安装geopandas库1.1 安装geopandas依赖库1.2 安装geopandas库1.3 安装matplotlib库 2 安装salem库2.1 安装salem依赖库2.2 安装salem库 3 安装cartopy库参考 salem库概述 salem是一个用于…

基于SpringBoot的个性化健康建议平台

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于智能推荐的卫生健康系统的相关信息成为…

uniapp打包安卓apk步骤

然后安装在手机上就可以啦

鼠标市场洞察:数据分析揭示消费趋势!

鼠标整体数据分析 一. 概述 本报告基于从淘宝商品搜索接口和淘宝精确月销量接口中提取的数据&#xff0c;分析了前百个品牌在销售额上的占比情况。分析涵盖了销售额和占比的数据&#xff0c;为决策提供了依据。(以上两个接口有需求的可以找我要链接&#xff09; 1. 大盘整体…

文本语义检索系统的搭建过程,涵盖了召回、排序以及Milvus召回系统、短视频推荐等相关内容

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下本文详细介绍了文本语义检索系统的搭建过程&#xff0c;涵盖了召回、排序以及Milvus召回系统的相关内容。通过使用PyTorch框架&#xff0c;我们提供了样例代码&#xff0c;以帮助读者更好地理解和实践。该系统具有广…

[网络基础]——ICMP(互联网控制消息协议)协议介绍

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;网络通信基础TCP/IP专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年10月15日8点23分 在现代网络通信中&#xff0c;互联网控制消息协议&#xff08;ICMP&#xff09;扮演着至关重要的角色…

SpringBoot+MyBatis+MySQL项目基础搭建

一、新建项目 1.1 新建springboot项目 新建项目 选择SpringBoot&#xff0c;填写基本信息&#xff0c;主要是JDK版本和项目构建方式&#xff0c;此处以JDK17和Maven举例。 1.2 引入依赖 选择SpringBoot版本&#xff0c;勾选Lombok&#xff0c;Spring Web&#xff0c;MyBa…