.NET9 - 新功能体验(三)

书接上回,我们继续来聊聊.NET9和C#13带来的新变化。

在这里插入图片描述

01、Linq新方法 CountBy 和 AggregateBy

引入了新的方法 CountBy 和 AggregateBy后,可以在不经过GroupBy 分配中间分组的情况下快速完成复杂的聚合操作,同时方法命名也非常直观,可以大大提升工作效率。

我们先以CountBy为例,简单实现一个小功能,统计不同年龄有多少人,代码如下:

public class Student
{public string Name { get; set; }public int Age { get; set; }
}
public void CountByExample()
{var students = new List<Student>{new Student { Name = "小明", Age = 10 },new Student { Name = "小红", Age = 12 },new Student { Name = "小华", Age = 10 },new Student { Name = "小亮", Age = 11 }};//统计不同年龄有多少人,两个版本实现//.NET 9 之前var group = students.GroupBy(x => x.Age);foreach (var item in group){Console.WriteLine($"年龄为:{item.Key},有:{item.Count()} 人。");}//.NET 9foreach (var student in students.CountBy(c => c.Age)){Console.WriteLine($"年龄为:{student.Key},有:{student.Value} 人。");}
}

通过代码可以发现,老版本中必须先调用GroupBy分组再调用Count统计才可完成,而现在只需要调用CountBy即可。

我们再以AggregateBy为例子,看看新老版本中如何计算每个班级中各自学生总年龄,代码如下:

public class Student
{public string Name { get; set; }public string Grade { get; set; }public int Age { get; set; }        
}
public void AggregateByExample()
{var students = new List<Student>{new Student { Name = "小明", Grade = "一班", Age = 10 },new Student { Name = "小红", Grade = "二班", Age = 12 },new Student { Name = "小华", Grade = "一班", Age = 10 },new Student { Name = "小亮", Grade = "二班", Age = 11 }};//统计每个班级各自学生总年龄,两个版本实现//.NET 9 之前var old = students.GroupBy(stu => stu.Grade).ToDictionary(group => group.Key, group => group.Sum(stu => stu.Age)).AsEnumerable();foreach (var item in old){Console.WriteLine($"班级:{item.Key},总年龄:{item.Value} 。");}//.NET 9foreach (var group in students.AggregateBy(c => c.Grade, 0, (acc, stu) => acc + stu.Age)){Console.WriteLine($"班级:{group.Key},总年龄:{group.Value} 。");}
}

02、序列化加强

在System.Text.Json中,.NET 9为序列化提供了新的选项和一个新的单例。

1、缩进选项

现在可以通过JsonSerializerOptions新属性IndentCharacter和IndentSize,自定义写入 JSON 的缩进字符和缩进大小。看看下面代码。

static void Main()
{var options = new JsonSerializerOptions{WriteIndented = true,IndentCharacter = '\t',IndentSize = 2,//处理中文乱码Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)};var json = JsonSerializer.Serialize(new Student { Name = "小明", Grade = "一班", Age = 10 },options);Console.WriteLine(json);Console.ReadKey();
}

代码执行效果如下:

在这里插入图片描述

2、默认 Web 选项单例

在之前的版本中如果想要以小驼峰命名规则序列化对象可以配合JsonProperty特性实现。现在则可以直接通过JsonSerializerOptions.Web单例直接实现。

var json = JsonSerializer.Serialize(new Student { Name = "xiaoming", Grade = "yinianji", Age = 10 },JsonSerializerOptions.Web
);
Console.WriteLine(json);

代码执行效果如下:

在这里插入图片描述

03、Task新方法Task.WhenEach

在.NET9之前,如果我们有一个任务列表,并希望每个任务完成后立刻处理它,那么我们只能通过不停的调用Task.WaitAny()方法来实现,现在.NET9引入了Task.WhenEach方法,以一种更优雅、更高效的方式处理这种情况。

因为Task.WhenEach 返回 IAsyncEnumerable<Task>,因此可以配合await foreach语句在任务完成时对其进行迭代,下面我们一起看看示例。

async Task WhenEachAsync()
{//生成100个随机时间完成的任务列表var tasks = Enumerable.Range(1, 100).Select(async i =>{await Task.Delay(new Random().Next(1000, 5000));return $"任务 {i} 完成";}).ToList();//.NET 9 之前while (tasks.Count > 0){var completedTask = await Task.WhenAny(tasks);tasks.Remove(completedTask);Console.WriteLine(await completedTask);}//.NET 9await foreach (var completedTask in Task.WhenEach(tasks)){Console.WriteLine(await completedTask);}
}

04、新的 TimeSpan.From* 重载

在.NET9之前TimeSpan类提供了几种From*方法,可以使用double类型来创建TimeSpan对象。但是,由于double是基于二进制的浮点格式,因此固有的不精确性可能会导致错误。

在这里插入图片描述

为了解决这个问题,.NET 9 添加了新的重载方法,可以使用整数创建TimeSpan对象。

在这里插入图片描述

如下面这段代码:

TimeSpan timeSpan1 = TimeSpan.FromSeconds(value: 101.832);
Console.WriteLine($"timeSpan1 = {timeSpan1}");
// timeSpan1 = 00:01:41.8319999
TimeSpan timeSpan2 = TimeSpan.FromSeconds(seconds: 101, milliseconds: 832);
Console.WriteLine($"timeSpan2 = {timeSpan2}");
// timeSpan2 = 00:01:41.8320000

05、新的内置Swagger

从.NET9开始使用Scalar代替内置的Swagger(Swashbuckle),一方面是因为Swashbuckle项目维护不够积极,另一个方面也是内部希望更专业于OpenAPI的发展。不管原因如何,我们都要根据自己的情况做好选择。

下面我们来一起体验一下Scalar。

首先创建一个Web Api项目,然后安装Scalar.AspNetCore包,修改Prag代码如:

public static void Main(string[] args)
{var builder = WebApplication.CreateBuilder(args);builder.Services.AddControllers();builder.Services.AddOpenApi();var app = builder.Build();// scalar/v1app.MapScalarApiReference(); app.MapOpenApi();app.UseAuthorization();app.MapControllers();app.Run();
}

然后我们添加一个简单的控制器,添加增删改查四个方法,代码如下:

[ApiController]
[Route("[controller]")]
public class OrdersController : ControllerBase
{private static readonly string[] Summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};private readonly ILogger<OrdersController> _logger;public OrdersController(ILogger<OrdersController> logger){_logger = logger;}[HttpGet(Name = "")]public IEnumerable<Order> Get(){return Enumerable.Range(1, 5).Select(index => new Order{Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),Price = Random.Shared.Next(-20, 55),Name = Summaries[Random.Shared.Next(Summaries.Length)]}).ToArray();}[HttpPost(Name = "")]public bool Post(Order order){return true;}[HttpPut(Name = "{id}")]public bool Put(string id, Order order){return true;}[HttpDelete(Name = "{id}")]public bool Delete(string id){return true;}
}

然后我们允许代码看看效果:

在这里插入图片描述

在这里插入图片描述

卖相还是相当惊艳的,左侧是接口列表,左下角可以切换黑白两种风格主题,右侧是接口详情,同时还配备了多种语言请求格式。

我们点击右下角Test Request测试一下获取接口。

在这里插入图片描述

可以在左边填写好参数,添加最上面的Send,会看到右下角请求结果。更详细复杂的应用大家可以自己摸索摸索。

:测试方法代码以及示例源码都已经上传至代码库,有兴趣的可以看看。https://gitee.com/hugogoos/Planner

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android蓝牙架构,源文件目录/编译方式学习

Android 版本 发布时间 代号&#xff08;Codename&#xff09; Android 1.0 2008年9月23日 无 Android 1.1 2009年2月9日 Petit Four Android 1.5 2009年4月27日 Cupcake Android 1.6 2009年9月15日 Donut Android 2.0 2009年10月26日 Eclair Android 2.1 2…

YOLO-World解读:零基础学习开放世界模型

文章目录 一、摘要二、引言相关工作方法预训练公式模型架构可重新参数化的视觉-语言路径聚合网络&#xff08;RepVL-PAN&#xff09; 3.4 预训练方案 实验YOLO-World: 利用多样化数据集进行开放词汇对象检测的预训练方法YOLO-World: LVIS数据集上的零样本性能评估YOLO-World: 预…

信创改造 - TongRDS 安装方式之控制台安装【Window】

安装前准备 安装 jdk1.8 即可&#xff0c;并配上 环境变量 安装 1&#xff09;解压缩 2&#xff09;启动 进入安装路径的console\bin目录&#xff0c;在cmd命令行窗口运行console.bat 输入序号 1 如果想查看运行状态&#xff0c;可以重新执行 console.bat&#xff0c;然后输…

志愿者小程序源码社区网格志愿者服务小程序php

志愿者服务小程序源码开发方案&#xff1a;开发语言后端php&#xff0c;tp框架&#xff0c;前端是uniapp。 一 志愿者端-小程序&#xff1a; 申请成为志愿者&#xff0c;志愿者组织端进行审核。成为志愿者后&#xff0c;可以报名参加志愿者活动。 志愿者地图&#xff1a;可以…

Node.js的下载与安装(支持各种新旧版本)

目录 1、node官网 2、node软件下载 3、软件安装&#xff08;完整版&#xff09; 1、node官网 Node.js — Download Node.jshttps://nodejs.org/en/download/package-manager 2、node软件下载 按照下图进行选择node版本&#xff08;真心推荐16/18&#xff0c;而是尽量是LTS…

对于相对速度的重新理解 - 2

回到先前说的&#xff0c;先令真空光速为标准光速&#xff0c; 光子的绝对速度 范围&#xff0c; 物质粒子的 范围&#xff0c; 这样的话&#xff0c;我们就可以根据 和 &#xff0c;把速度分成3个段&#xff0c; 这样就可以出现速度和它的负值&#xff0c;也就是速度的矢量具…

大模型系列11-ray

大模型系列11-ray PlasmaPlasmaStore启动监听处理请求 ProcessMessagePlasmaCreateRequest请求PlasmaCreateRetryRequest请求PlasmaGetRequest请求PlasmaReleaseRequestPlasmaDeleteRequestPlasmaSealRequest ObjectLifecycleManagerGetObjectSealObject ObjectStoreRunnerPlas…

Java---反射机制

JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c; 都能够调用它的任意方法和属性&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 在编译后产生…

Java 线程状态详解

1 引言 在 Java 多线程编程中&#xff0c;线程的状态是一个非常重要的概念。了解线程的状态及其转换过程&#xff0c;有助于我们更好地理解和控制线程的行为。本文将详细介绍 Java 线程的 6 种状态&#xff0c;并通过示例代码和图解来帮助读者更好地理解这些状态及其转换过程。…

AirScreen 安卓平板作为MacOS副屏

前言&#xff1a; 对笔记本续航有刚需&#xff0c;不得不选MacBook。 手机用的是mate40Pro&#xff0c;平板用的是matepad pro 12.6 干货&#xff1a; 参考网友的分享&#xff1a; https://www.bilibili.com/video/BV12A4y1d7zX/?spm_id_from333.337.search-card.all.click 【…

深度强化学习(RL)介绍

深度强化学习&#xff08;RL&#xff09;介绍 写到了一半&#xff0c;图待后补 一、强化学习概述 &#xff08;一&#xff09;与监督学习对比及定义 强化学习不同于监督学习&#xff0c;在一些任务中数据标注困难&#xff0c;但机器可通过环境反馈知道结果好坏。强化学习是机…

使用 Elasticsearch 构建食谱搜索(二)

这篇文章是之前的文章 “使用 Elasticsearch 构建食谱搜索&#xff08;一&#xff09;” 的续篇。在这篇文章中&#xff0c;我将详述如何使用本地 Elasticsearch 部署来完成对示例代码的运行。该项目演示了如何使用 Elastic 的 ELSER 实现语义搜索并将其结果与传统的词汇搜索进…

数据结构 【带环单链表】

在单链表中可能会存在一种情况&#xff0c;某一结点在经过几次转移之后回到了自己本身&#xff0c;这种情况就称之为带环链表。对于带环链表&#xff0c;我们不能轻易对其进行遍历&#xff0c;遍历可能会导致产生死循环。 带环链表的逻辑图如下所示&#xff1a;&#xff08;这…

Vue 项目中如何使用FullCalendar 时间段选择插件(类似会议室预定、课程表)

本文中是基于VUEelementui项目中实现的前后端分离的前端功能部分&#xff1a; 插件的官方文档&#xff1a;FullCalendar 1.安装对应依赖&#xff08;统一安装版本为6.15&#xff09; npm install --save fullcalendar/core6.15 npm install --save fullcalendar/daygrid6.…

学习路之压力测试--jmeter安装教程

Jmeter安装 0、先安装jdk:这里是安装jdk-8u211-windows-x64 1、百度网盘上下载 jdk和jmeter 链接: https://pan.baidu.com/s/1qqqaQdNj1ABT1PnH4hfeCw?pwdkwrr 提取码: kwrr 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 官网&#xff1a;Apache JMeter - D…

SQL99版全外连接和交叉连接和总结

全外连接MySQL不支持 elect 查询列表 from 表名1 表别名1 cross join 表名2 表别名2 on 连接条件 ...... ; 交叉连接 就两个记录做笛卡尔积&#xff01;没什么好说的&#xff0c;基本也没用过&#xff01; 总结

Python爬虫:深入探索1688关键词接口获取之道

在数字化经济的浪潮中&#xff0c;数据的价值愈发凸显&#xff0c;尤其是在电商领域。对于电商平台而言&#xff0c;关键词不仅是搜索流量的入口&#xff0c;也是洞察市场趋势、优化营销策略的重要工具。1688作为中国领先的B2B电商平台&#xff0c;其关键词接口的获取对于商家来…

ffmpeg本地编译不容易发现的问题 — Error:xxxxx not found!

这里区分电脑CPU架构 本次编译是在Mac笔记本&#xff0c;M1芯片上进行&#xff01; 前面大致流程&#xff1a;分为两种&#xff08;1.仅适用&#xff0c;直接下载编译好的本地安装即可&#xff1b;2.使用并查看源码&#xff0c;自己修改编译运行&#xff09;。这里介绍的是第…

从0-1逐步搭建一个前端脚手架工具并发布到npm

前言 本文介绍的案例已同步到github&#xff0c;github地址。 vue-cli 和 create-react-app 等 cli 脚手架工具用于快速搭建应用&#xff0c;无需手动配置复杂的构建环境。本文介绍如何使用 rollup 搭建一个脚手架工具。 脚手架工具的工作流程简言为&#xff1a;提供远端仓库…