当前位置: 首页 > news >正文

【从零开始入门unity游戏开发之——C#篇41】C#迭代器(Iterator)——自定义类实现 foreach 操作

文章目录

  • 前言
  • 一、什么是迭代器?
  • 二、标准迭代器的实现方法
    • 1、自定义一个类`CustomList`
    • 2、让CustomList继承IEnumerable接口
    • 3、再继承IEnumerator接口
    • 4、完善迭代器功能
    • 5、**foreach遍历的本质**:
    • 6、在Reset方法里把光标复原
  • 三、用yield return语法糖实现迭代器
    • 1、用yield return语法糖为普通类实现迭代器
    • 2、用yield return语法糖为泛型类实现迭代器
  • 四、总结
  • 专栏推荐
  • 完结

前言

前面我们使用过foreach 来遍历过如列表数组等数据等,之所以可以这么做,其实就是它们内部已经帮我们实现了迭代器功能。

迭代器其实很像我们之前学过的自定义类排序——IComparable<T> 接口的实现,思路是类似的。

一、什么是迭代器?

在 C# 中,迭代器(Iterator)是一种特殊的方法,允许你在集合中按顺序逐个访问元素,而无需暴露集合的内部实现。通常,迭代器用于实现 foreach 循环。

C# 中有两种主要方式来实现迭代器:

  • IEnumerable<T>IEnumerator<T> 接口:这是实现迭代器的基础,通过实现这两个接口可以自定义迭代行为。
  • yield 语法糖:这是 C# 提供的一种简化的方式来实现迭代器。

语法糖是指某些语言特性或语法结构的简化,目的是提高代码的简洁性和可读性,同时不改变代码的语义或功能。

二、标准迭代器的实现方法

为了使自定义的类可以被foreach语句遍历,该类需要实现IEnumerable接口,并且通常还需要实现IEnumerator接口。IEnumerator接口提供了获取当前元素、移动到下一个元素以及重置位置的方法。通过实现这两个接口,我们能够控制如何遍历自定义类型的实例。

1、自定义一个类CustomList

class CustomList{private int[] list;public CustomList(){list = new int[] {1, 2, 3, 4, 5};}
}

现在直接使用foreach语句遍历CustomList肯定会报错,因为我们并没有实现迭代器
在这里插入图片描述

2、让CustomList继承IEnumerable接口

记得需要引入using System.Collections;命名空间,接口要求必须实现GetEnumerator方法

using System.Collections;class CustomList : IEnumerable{private int[] list;public CustomList(){list = new int[] {1, 2, 3, 4, 5};}public IEnumerator GetEnumerator(){}
}

但是其实继承IEnumerable接口都不重要,只要实现了GetEnumerator方法即可
在这里插入图片描述

但是为什么要继承呢?其实就是规定你严格实现GetEnumerator方法,且这个方法也不好记

你会发现这时候,其实前面的foreach遍历就已经不报错了
在这里插入图片描述
现在执行遍历肯定还是走不通的,因为我们迭代器根本没实现任何内容

3、再继承IEnumerator接口

再继承IEnumerator接口,并实现里面的MoveNextReset方法和Current属性
在这里插入图片描述

4、完善迭代器功能

声明一个index 光标,完善迭代器功能

class CustomList : IEnumerable, IEnumerator{private int[] list;//从-1开始的光标用于表示数据得到了哪个位置private int index = -1;public CustomList(){list = new int[] {1, 2, 3, 4, 5};}public object Current => list[index];public IEnumerator GetEnumerator(){//直接把自己返回即可return this;}public bool MoveNext(){//移动光标index++;//是否溢出 溢出返回falsereturn index < list.Length;}public void Reset(){throw new NotImplementedException();}
}

这时候前面foreach就可以打印出内容了

CustomList customList= new CustomList();
foreach (int item in customList){Console.WriteLine(item);
}

结果
在这里插入图片描述

5、foreach遍历的本质

  • 先获取in后面这个对象的IEnumerator,会调用对象其中的GetEnumerator方法来获取IEnumerator对象
  • 执行这个IEnumerator对象中的MoveNext方法
  • 只要MoveNext方法的返回值时true就会去得到Current的值然后赋值给item

6、在Reset方法里把光标复原

现在还差一个Reset方法没有实现,这又有什么用呢?

比如如果我们需要遍历两次数据

CustomList customList= new CustomList();foreach (int item in customList){Console.WriteLine(item);
}foreach (int item in customList){Console.WriteLine(item);
}

结果
在这里插入图片描述

结果只打印了一次数据,因为我们的光标一直在加,超出索引,再继续打印MoveNext一直返回false,就没有数据了,所以我们需要在Reset里把光标复原

public void Reset()
{//重置光标index = -1;
}

什么时候调用呢?在GetEnumerator方法里调用即可,每次foreach开始会得到一次IEnumerator,且只会运行一次,我们可以写个打印验证这一点

public IEnumerator GetEnumerator()
{Console.WriteLine("开始遍历");Reset();//直接把自己返回即可return this;
}

结果,遍历两次,打印了两次数据,且每次遍历开始都仅调用一次GetEnumerator方法获取IEnumerator
在这里插入图片描述
注:Reset方法重置光标位置,一般写在获取IEumerator对象这个函数中,用于每次foreach遍历开始时先重置光标位置

三、用yield return语法糖实现迭代器

前面实现这个迭代器是不是感觉非常麻烦?所以C#专门提供了yield return语法糖来帮助我们简化实现迭代器,yield return 会将当前值返回给调用者,并暂停执行,直到下次请求下一个值时继续。

1、用yield return语法糖为普通类实现迭代器

我们只需要继承IEnumerable接口,实现GetEnumerator方法即可

class CustomList : IEnumerable {private int[] list;public CustomList(){list = new int[] {1, 2, 3, 4, 5};}public IEnumerator GetEnumerator(){for (int i = 0; i< list.Length; i++){yield return list[i];}}
}

foreach 遍历打印

CustomList customList= new CustomList();Console.WriteLine("第一次遍历");foreach (int item in customList){Console.WriteLine(item);
}Console.WriteLine("第二次遍历");foreach (int item in customList){Console.WriteLine(item);
}

结果和前面一样,但是实现却方便了很多是不是
在这里插入图片描述
GetEnumerator里其实也可以这么写,效果一样

public IEnumerator GetEnumerator()
{// for (int i = 0; i< list.Length; i++){//     yield return list[i];// }yield return list[0];yield return list[1];yield return list[2];yield return list[3];yield return list[4];
}

但是通常肯定不会这么做,这里介绍这么写得方法,为了让你更容易理解yield return 的工作机制。

使用 yield return 的方法其实并没有创建一个完整的集合或数组,而是创建了一个延迟执行的状态机。每次调用迭代器方法时,都会从上一次暂停的位置继续执行yield return 使得方法的执行过程可以暂停和恢复,这就是懒加载的本质。

你可以会问,前面不是说了foreach 每次遍历开始都仅调用一次GetEnumerator方法获取IEnumerator吗?这和yield return机制好像冲突了。

其实不然。在 foreach 循环内部,GetEnumerator 方法只会在循环开始时被调用一次。每次迭代时,foreach 使用的是同一个 IEnumerator 对象,这个对象负责管理 yield return 的暂停和恢复。本质其实和前面标准迭代器的实现方法是一样的

2、用yield return语法糖为泛型类实现迭代器

泛型类实现其实也是一样,相信大家应该都懂了,这里就直接放出例子,大家参考参考

class CustomList<T> : IEnumerable 
{private T[] array;public CustomList(params T[] array){this.array = array;}public IEnumerator GetEnumerator(){for (int i = 0; i< array.Length; i++){yield return array[i];}}
}

调用

CustomList<string> customList= new CustomList<string>("向", "宇", "的", "客", "栈");Console.WriteLine("第一次遍历");foreach (string item in customList){Console.WriteLine(item);
}Console.WriteLine("第二次遍历");foreach (string item in customList){Console.WriteLine(item);
}

结果
在这里插入图片描述

四、总结

迭代器就是可以让我们在外部直接通过foreach遍历对象中元素而不需要了解其结构如何

主要的两种方式

  • 传统方式继承两个接口实现里面的方法
  • 用语法糖yield return去返回内容只需要继承一个接口即可

专栏推荐

地址
【从零开始入门unity游戏开发之——C#篇】
【从零开始入门unity游戏开发之——unity篇】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架开发】

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

相关文章:

【从零开始入门unity游戏开发之——C#篇41】C#迭代器(Iterator)——自定义类实现 foreach 操作

文章目录 前言一、什么是迭代器&#xff1f;二、标准迭代器的实现方法1、自定义一个类CustomList2、让CustomList继承IEnumerable接口3、再继承IEnumerator接口4、完善迭代器功能5、**foreach遍历的本质**&#xff1a;6、在Reset方法里把光标复原 三、用yield return语法糖实现…...

运算符重载 - 自定义运算符行为

引言 C 是一种支持面向对象编程&#xff08;OOP&#xff09;的编程语言&#xff0c;它允许程序员通过运算符重载来自定义类的行为。运算符重载使得我们可以为自定义类型定义与内置类型相似的操作方式&#xff0c;从而使代码更加直观和易读。 本文将详细介绍 C 中的运算符重载…...

RabbitMQ-基本使用

RabbitMQ: One broker to queue them all | RabbitMQ 官方 安装到Docker中 docker run \-e RABBITMQ_DEFAULT_USERrabbit \-e RABBITMQ_DEFAULT_PASSrabbit \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network mynet\-d \rabbitmq:3…...

sklearn基础教程

sklearn&#xff0c;全称为Scikit-learn&#xff0c;是一个基于Python的开源机器学习库&#xff0c;广泛用于数据挖掘和数据分析。它建立在NumPy、SciPy和matplotlib这些科学计算库之上&#xff0c;提供了简单而高效的工具来解决各种机器学习问题。 安装 首先&#xff0c;确保…...

173. 矩阵距离 acwing -多路BFS

原题链接&#xff1a;173. 矩阵距离 - AcWing题库 给定一个 N行 M 列的 01矩阵 A&#xff0c;A[i][j] 与 A[k][l]]之间的曼哈顿距离定义为&#xff1a; dist(i,j,k,l)|i−k||j−l|| 输出一个 N 行 M 列的整数矩阵 B&#xff0c;其中&#xff1a; B[i][j]min1≤x≤N,1≤y≤M,A…...

【MySQL】--- 内置函数

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; MySQL &#x1f3e0; 时间函数 约定&#xff1a;我们在MySQL中说的日期指的是年 月 日&#xff0c;时间指的是时 分 秒。 &#x1f9f7; now() select n…...

更改element-plus的table样式

表头样式&#xff1a; <el-table :data"props.tableData" style"width: 100%" :header-cell-style"headerCellStyle" :cell-style"cellStyle"> </el-table>样式&#xff1a; // 表头样式 const headerCellStyle {backgro…...

25.Java JUC 引入(进程与线程、线程的状态、并发与并行、管程、用户线程与守护线程)

一、JUC 简介 JUC 是 java.util.concurrent 工具包的简称&#xff0c;这是一个处理线程的工具包&#xff0c;从 JDK1.5 开始出现 二、进程与线程 1、基本介绍 &#xff08;1&#xff09;进程 进程是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源…...

双目视觉:reprojectImageTo3D函数

前言 reprojectImageTo3D 是 OpenCV 中用于从视差图生成三维点云的函数。它的原理是利用视差图和相机的校准参数&#xff0c;通过三角测量法&#xff0c;计算每个像素对应的三维坐标。以下内容根据源码分析所写&#xff0c;觉得可以的话&#xff0c;点赞收藏哈&#xff01;&am…...

深度解析 Kubernetes Service 负载均衡器及其在 Cube Studio 推理服务中的优化选择

目录 一、Kubernetes Service 负载均衡器概述 Service 的核心功能&#xff1a; 二、Kubernetes Service 类型及适用场景 1. ClusterIP&#xff08;默认类型&#xff09; 2. NodePort 3. LoadBalancer 4. ExternalName 5. Ingress&#xff08;增强型 Service&#xff09;…...

NLP 中文拼写检测纠正论文-07-NLPTEA-2020中文语法错误诊断共享任务概述

拼写纠正系列 NLP 中文拼写检测实现思路 NLP 中文拼写检测纠正算法整理 NLP 英文拼写算法&#xff0c;如果提升 100W 倍的性能&#xff1f; NLP 中文拼写检测纠正 Paper java 实现中英文拼写检查和错误纠正&#xff1f;可我只会写 CRUD 啊&#xff01; 一个提升英文单词拼…...

快速上手LangChain(三)构建检索增强生成(RAG)应用

文章目录 快速上手LangChain(三)构建检索增强生成(RAG)应用概述索引阿里嵌入模型 Embedding检索和生成RAG应用(demo:根据我的博客主页,分析一下我的技术栈)快速上手LangChain(三)构建检索增强生成(RAG)应用 langchain官方文档:https://python.langchain.ac.cn/do…...

深度学习中的离群值

文章目录 深度学习中有离群值吗&#xff1f;深度学习中的离群值来源&#xff1a;处理离群值的策略&#xff1a;1. 数据预处理阶段&#xff1a;2. 数据增强和鲁棒模型&#xff1a;3. 模型训练阶段&#xff1a;4. 异常检测集成模型&#xff1a; 如何处理对抗样本&#xff1f;总结…...

汽车燃油软件标定测试

油箱测试 确定油箱的参数&#xff1a; 总容积&#xff0c;额定容积&#xff0c;不可用容积等。油泵测试&#xff08;静态&#xff09; 分为加油测试&#xff0c;减油测试&#xff0c;1L或者500ml增减&#xff1b; 分别测试油泵的阻值输出&#xff0c;类似&#xff1a; 油量 阻…...

#C02L02P01. C02.L02.一维数组最值问题.知识点1.求最大值

从键盘读入n&#xff08;1<n<100&#xff09;个正整数&#xff0c;输出最大值。 算法分析 假设一个最大值 maxx0 &#xff1b; maxx 依次跟数组中的元素进行比较&#xff1b; 如果该数组元素大于 maxx &#xff0c;则将该数组元素值赋值给 maxx &#xff1b; maxx 即…...

pycharm如何拉取一个git项目,然后,修改后再上传到自建的项目中?

以chattts为例 https://github.com/2noise/ChatTTS.git 1.建一个虚拟环境&#xff0c;用于项目使用 2.pychar&#xff4d;新建工程 &#xff13;.忽略 提示 勾选&#xff0c;新建远程仓库 设置账号和密码 设置git路径&#xff0c;一般是正确的&#xff0c;点测试即可 &…...

【数据库初阶】MySQL中表的约束(上)

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; 数据库初阶 &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 亲爱的小伙伴们&#xff0c;大家好&#xff01;在这篇文章中&#xff0c;我们将深入浅出地为大家讲解 MySQL…...

smbms超市管理系统

系统测试及实现效果 完整源码已上传资源 登录界面 系统首页 订单管理页面 用户管理页面 供应商管理页面 密码修改 SQL语句分析 存储引擎&#xff1a;InnoDB&#xff0c;支持事务和外键&#xff1b;字符集&#xff1a;utf8&#xff0c;支持多语言字符&#xff1b;排序规则&am…...

Visual Studio 中增加的AI功能

前言&#xff1a; 人工智能的发展&#xff0c;在现在&#xff0c;编程技术的IDE里面也融合了AI的基本操做。本例&#xff0c;以微软的Visual Studio中的人工智能的功能介绍例子。 本例的环境&#xff1a; Visual Studio 17.12 1 AI 智能变量检测&#xff1a; 上图展示了一…...

大功率PCB设计

1.电源和电机的走线用线径较大的铺铜&#xff0c;讲究的是走线顺畅&#xff1a; 2.同一个电源属性四层板都铺铜&#xff0c;并打很多过孔: 3.走线顺畅&#xff0c;可以看到从左到右供电。从右向左接地&#xff0c;加电流采样&#xff1a; 一个问题&#xff0c;这样会形成电源环…...

Nginx与frp结合实现局域网和公网的双重https服务

背景&#xff1a; 因为局域网内架设了 tiddlywiki、 Nextcloud 等服务&#xff0c;同时也把公司的网站架设在了本地&#xff0c;为了实现局域网直接在局域网内访问&#xff0c;而外部访问通过frps服务器作为反向代理的目的&#xff0c;才有此内容。 实现的效果如下图琐事 不喜欢…...

改投论文时如何重构

摘要: 不同期刊和会议对于论文的风格、页数限制等方面有一些差别, 论文在某个地方被拒, 改投别处时需要进行重构. 本贴描述重构的基本方案. 你的衣柜乱糟糟的, 如何清理呢? 方案 A. 把不喜欢的衣服一件件丢掉.方案 B. 把衣服全部丢出来, 然后再把喜欢的衣服一件件放进去. 对…...

【YOLOv5】源码(common.py)

该文件位于/models/common.py&#xff0c;提供了构建YOLOv5模型的各种基础模块&#xff0c;其中包含了常用的功能模块&#xff0c;如自动填充autopad函数、标准卷积层Conv、瓶颈层Bottleneck、C3、SPPF、Concat层等 参考笔记&#xff1a;【YOLOv3】 源码&#xff08;common.py…...

python中的赋值方法

python赋值方法有很多&#xff0c;主要可以分为链式赋值、系列解包赋值、常量形式赋值&#xff0c;下面介绍下三者间区别&#xff1a; 1、链式赋值&#xff1a; 链式赋值用于同一个对象赋值给多个变量 xy123 可以认为是 x 123 y 123 2、系列解包赋值&#xff1a; 系列数据…...

pyhton 掩码 筛选显示

目录 bitwise_and控制&#xff1a; 点乘&#xff1a; 性能对比&#xff1a; bitwise_and控制&#xff1a; import cv2# 读取彩色图和mask二值图 color_img cv2.imread(color_image.jpg) mask cv2.imread(mask.jpg, 0) # 以灰度模式读取二值图# 确保彩色图和mask的尺寸一…...

测试覆盖率

1、概念 覆盖率测试&#xff0c;也称为测试覆盖率分析&#xff0c;是软件测试中的一个重要概念&#xff0c;用来衡量测试用例执行时对代码的覆盖程度。它提供了一种量化的方法来评估测试集的充分性&#xff0c;即测试是否足够广泛地触及了应用程序的所有部分。覆盖率测试可以应…...

clickhouse query_log 常用查询语句

1、查询一段时间耗时超过3秒的语句。 SELECT* FROMsystem.query_log WHEREquery_duration_ms > 30000AND event_time > 2024-12-31 15:50:00 AND event_time < 2024-12-31 17:50:00 ORDER BYevent_time desc;2、查询一段时间报错的语句 SELECT* FROMsystem.query_lo…...

uni-app 资源引用(绝对路径和相对路径)方法汇总

文章目录 一、前言&#x1f343;二、绝对路径和相对路径2.1 绝对路径2.2 相对路径 三、引用组件四、引用js4.1 js 文件引入4.2 NPM支持 五、引用css六、引用json6.1 json文件引入 七、引用静态资源7.1 模板内引入静态资源7.2 css 引入静态资源7.3 js/uts 引入静态资源7.4 静态资…...

Java SpringBoot使用EasyExcel导入导出Excel文件

点击下载《Java SpringBoot使用EasyExcel导入导出Excel文件(源代码)》 在 Java Spring Boot 项目中&#xff0c;导入&#xff08;读取&#xff09;和导出&#xff08;写入&#xff09; Excel 文件是一项常见的需求。EasyExcel 是阿里巴巴开源的一个用于简化 Java 环境下 Excel…...

CDN SSLTLS以及安全

随着互联网的发展&#xff0c;内容分发网络&#xff08;CDN&#xff09;在提升网站访问速度和安全性方面发挥了重要作用。然而&#xff0c;CDN在带来便利的同时也面临一些安全挑战。本文将探讨CDN的安全风险&#xff0c;并深入解析SSL/TLS加密技术及其在CDN中的应用。 CDN的安全…...

安卓11 SysteUI添加按钮以及下拉状态栏的色温调节按钮

最近客户想要做一个台灯产品&#xff0c;需要实现 串口调节台灯功能 &#xff0c;其中包括 亮度调节 色温调节 开关 三个功能 话不多说&#xff0c;贴代码 diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml old mode 100644 new …...

SpringMVC启动与请求处理流程解析

目录 SpringMVC的基本结构 1.MVC简介 2.基本结构 什么是Handler&#xff1f; 什么是HandlerMapping? 什么是HandlerAdapter&#xff1f; RequestMapping方法参数解析 DispatcherServlet的init()方法 DispatcherServlet的doService()方法 SpringBoot整合SpringMVC …...

RabbitMQ案例

1. 导入依赖 <!--AMQP依赖&#xff0c;包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> 发送消息 注入RabbitTemplate Autowired RabbitT…...

前路漫漫,曙光在望 !

起始 从20年大一开始写作至今&#xff0c;转眼五年时光已经过去了&#xff0c;最开始在CSDN这个平台写博客也只是因为一次机缘巧合情况下得知写博客可以获取奖赏&#xff0c;所以那个时期开始疯狂在CSDN发文记录自己编程学习过程&#xff0c;但是至今也未从写作中获利一分哈…...

音视频-----RTSP协议 音视频编解码

流媒体协议详解&#xff1a;RTSP、RTP、RTCP、SIP、SDP、RTMP、WebRTC、WebSocket-CSDN博客 上文讲解比较清楚 多媒体编解码基础知识 一文详解WebRTC、RTSP、RTMP、SRT-腾讯云开发者社区-腾讯云 RTP :(Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传…...

SpringMVC的消息转换器

SpringMVC的消息转换器&#xff08;Message Converter&#xff09;是Spring框架中用于处理HTTP请求和响应体与Java对象之间转换的组件。它们使得开发人员可以轻松地将HTTP请求的数据映射到方法参数&#xff0c;并将返回的对象转换为HTTP响应。 工作原理 当一个HTTP请求到达Spr…...

计算机网络练习题

学习这么多啦&#xff0c;那就简单写几个选择题巩固一下吧&#xff01; 1. 在IPv4分组各字段中&#xff0c;以下最适合携带隐藏信息的是&#xff08;D&#xff09; A、源IP地址 B、版本 C、TTL D、标识 2. OSI 参考模型中&#xff0c;数据链路层的主要功能是&#xff08;…...

本地测试文件解析

PostMapping("/test") public void test() throws IOException {Path csvFile Paths.get("D:\\test/27.csv");//虚拟机退出时删除临时文件csvFile.toFile().deleteOnExit();List<String> list Files.readAllLines(csvFile, Charset.forName("…...

websocket-sharp:.NET平台上的WebSocket客户端与服务器开源库

推荐一个C#开发的&#xff0c;实现WebSocket功能的开源项目。 01 项目简介 websocket-sharp提供 WebSocket 客户端和服务器库&#xff0c;基于 C# 开发的&#xff0c;并遵循 WebSocket 协议规范&#xff0c;使得开发人员能够轻松地在 .NET 应用程序中实现 WebSocket 通信。 …...

SwiftUI 撸码常见错误 2 例漫谈

概述 在 SwiftUI 日常撸码过程中&#xff0c;头发尚且还算茂盛的小码农们经常会犯这样那样的错误。虽然犯这些错的原因都很简单&#xff0c;但有时想要快速准确的定位它们却并不容易。 况且这些错误还可能在模拟器和 Xcode 预览&#xff08;Preview&#xff09;表现的行为不甚…...

回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测 数据准备&#x…...

Nginx常用配置之详解(Detailed Explanation of Common Nginx Configurations)

Nginx常用配置详解(图文全面总结) Nginx Nginx 是一款轻量级的高性能 HTTP、 和反向代理服务器。 Nginx&#xff0c;被广泛用于负载均衡、静态文件服务、和代理.........等。 Nginx&#xff0c;以高并发、低内存占用、和高可用性著称&#xff0c;大部分的大厂以及公司都在使…...

【PyTorch入门】 PyTorch不同优化器的比较

本次分享pytorch中几种常用的优化器&#xff0c;并进行互相比较。 PyTorch 优化器原理及优缺点分析 在 PyTorch 中&#xff0c;torch.optim 提供了多种优化器用于神经网络训练。每种优化器背后有不同的更新规则和机制&#xff0c;旨在适应不同的训练需求。以下是五种常见优化器…...

jest使用__mocks__设置模拟函数不生效 解决方案

模拟文件 // __mocks__/axios.js const axios jest.fn(); axios.get jest.fn(); axios.get.mockResolvedValue({data: {undoList: [get data],}, }); export default axios; 测试文件 jest.mock(axios); import Axios from axios;test(mytest, () > {console.log("…...

聆听音乐 1.5.9 | 畅听全网音乐,支持无损音质下载

聆听音乐手机版是面向广大音乐爱好者的移动应用程序&#xff0c;用户可以随时随地通过手机享受丰富的音乐资源。它提供了多种魅力功能&#xff0c;让用户在手机上畅享更舒适的音乐体验&#xff0c;每位用户都能享受精彩纷呈的收听体验。此外&#xff0c;软件还支持无损音质音乐…...

VMware去虚拟化

介绍两款用于去除VMware虚拟机虚拟化特征的工具&#xff0c;这些工具可以帮助用户在虚拟机中运行游戏时避免被游戏检测到虚拟机环境&#xff0c;从而防止游戏因检测到虚拟机而闪退。这些工具通过修改虚拟机的硬件信息&#xff08;如硬盘、声卡、网卡、主板芯片组、显卡、主板信…...

汉王扫描王 2.9.16 |免费无广告的智能扫描软件,支持多种格式导出

汉王扫描王是一款功能全面的智能扫描软件&#xff0c;集成了文字识别、表格提取和文档转换等功能。它支持将文档转换为PDF、Word、Excel等多种格式&#xff0c;非常适合学生、教师、业务人员和财务工作者使用。该软件具备手机扫描仪功能&#xff0c;能够自动抠边、矫正文档&…...

毕设中所学

1、交叉引用 在毕业设计论文Word中交叉引用参考文献_交叉引用如何标注[1~6]-CSDN博客 另&#xff1a;将标号或其他文字改为上标的快捷键是CtrlShift。 图的交叉引用一样&#xff0c;修改引用类型即可。 2、ENVI安装 ENVI5.6 安装教程&#xff0c;新手入门&#xff08;超详细…...

[微服务]分布式搜索Java客户端

快速入门 使用RestClient客户端进行数据搜索可以分为两步 构建并发起请求 代码解读&#xff1a; 第一步&#xff0c;创建SearchRequest对象&#xff0c;指定索引库名第二步&#xff0c;利用request.source()构建DSL&#xff0c;DSL中可以包含查询、分页、排序、高亮等 query…...

STM32 拓展 低功耗案例3:待机模式 (hal)

配置PA0的两种方式&#xff1a; 第一种 第二种 复制寄存器代码然后对其进行修改 mian.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body…...