C# IEnumerator IEnumerable接口

前言

使用linq的时候大家应该都知道IEnumerable和IEnumerator接口!

解释一下

  • IEnumerable 它利用 GetEnumerator() 返回 IEnumerator 集合访问器,声明实现该接口的class是“可枚举(enumerable)”的 通俗点说就是可进行迭代操作的类型。

  • IEnumerator解释:它是一个的集合访问器,使用foreach语句遍历集合或数组时,就是调用 Current、MoveNext()的结果。

例子

今天给大家讲讲迭代器的原理 我们自己实现一个UserInforMationList

我这里定义一个UserInforMationModel和UserInforMationList类

public class UserInforMationList{public UserInforMation[] _UserInforMations;public void Add(UserInforMation[] userInforMations){_UserInforMations = new UserInforMation[userInforMations.Length];for (int i = 0; i < userInforMations.Length; i++){_UserInforMations[i] = userInforMations[i];}}}
public class UserInforMation{public string UserName { get; set; }public string Sex { get; set; }}

3424c8e483a4bafeb9b33ab0d1f62ad7.png

使用我们的测试方法,发现我们的代码报错了UserInforMationList不包含 GetEnumerator的公共实例,因此不能使用ForEach.

那么我们要怎么实现Foreach了那就要用到IEnumerator、IEnumerable!

提示告诉我们缺少一个GetEnumerator的公共实例

我们看下IEnumerable接口

public interface IEnumerable{[DispId(-4)][__DynamicallyInvokable]IEnumerator GetEnumerator();}

Enumerable接口刚好返回一个GetEnumerator 然后再看一下IEnumerator

IEnumerator接口为类内部的集合提供了迭代方式, IEnumerator 要求你实现三个方法:

public interface IEnumerator{[__DynamicallyInvokable]object Current{[__DynamicallyInvokable]get;}[__DynamicallyInvokable]bool MoveNext();[__DynamicallyInvokable]void Reset();}

看了这两个接口就可以知道我们的UserInforMationList:要继承这个IEnumerable接口 这个接口返回的是一个GetEnumerator。观察这方法,

public IEnumerator GetEnumerator(){throw new NotImplementedException();}

需要返回一个叫做IEnumerator的接口,因此,一个类要想可迭代,还需要进一步实现IEnumerator类,这个才是真正获取到的迭代器,

那我们再定义一个UserInforMationEnumerator继承于GetEnumerator然后实现这三个方法,

  • MoveNext方法:该方法将集合索引加1,并返回一个bool值,指示是否已到达集合的末尾。

  • Reset方法:它将集合索引重置为其初始值-1,这会使枚举数无效。

  • Current方法: 返回position位置的当前对象

public class UserInforMationEnumerator : IEnumerator{public UserInforMation[] _userInforMations;public int _Index = -1;public UserInforMationEnumerator(UserInforMation[] userInforMations){_userInforMations = userInforMations;}public object Current => _userInforMations[_Index];public bool MoveNext(){_Index++;return _Index < _userInforMations.Length;}public void Reset(){_Index = -1;}}

这样我们就实现了自己的迭代器。

然后我们跑一下代码

aa5b8bfc3e6d8963330e510fc0dc5778.png

我们调用GetEnumerator的时候,看似里面for循环了一次,其实这个时候没有做任何操作。只有调用MoveNext的时候才会对应调用for循环:

现在我想可以回答你为什么Linq to Object中要返回IEnumerable?:

因为IEnumerable是延迟加载的,每次访问的时候才取值。也就是我们在Lambda里面写的where、select并没有循环遍历(只是在组装条件),只有在ToList或foreache的时候才真正去集合取值了。这样大大提高了性能。

最后大家如果喜欢我的文章,还麻烦给个关注并点个赞, 希望net生态圈越来越好!

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

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

相关文章

linux中mpich的运行线程,贝叶斯法构建进化树:MrBayes

1. 简介使用贝叶斯法构建进化树的软件有很多。在这里简要介绍MrBayes的安装和使用。以下介绍是对几种贝叶斯法构建进化树软件的简介&#xff1a;MrBayes is a program for Bayesian inference and model choice across a wide range of phylogenetic and evolutionary models. …

linux c之gcc -g file.c -o file提示warning: no newline at end of file

1 问题 编译c文件的时候&#xff0c;命令如下 gcc -g file.c -o file 错误提示如下 warning: no newline at end of file 2 解决办法 原因&#xff1a;源文件的最后一行没有回车符造成 我们用vim编辑文件&#xff0c;然后到文件最后一行回车就行 vi和vim操作&#xff0…

php strtoupper 和 array_change_key_case 字符串转大写,小写

strtoupper &#xff1a;字符串转为大写。 array_change_key_case 则是把数组的所有的键转换为大写字母。 strtoupper&#xff1a; <?phpecho strtoupper("Hello world!"); 输出&#xff1a; HELLO WORLD! strtolower &#xff1a;字符串转为小写。 <?…

用Excel VBA连接SQL Server数据库并将表中的数据显示到Excel中

本实例使用VB语言和OLEDB类连接SQL Server 2005数据库。 在sheet1上右键→查看代码&#xff0c;加入如下代码&#xff1a; Sub admin()Dim conn, xRsSet conn CreateObject("ADODB.Connection")conn.Open "ProviderSQLOLEDB.1;Persist Security InfoFalse;Use…

filter与servlet对照

最近在开java物自&#xff0c;还记得刚开始使用servlet这是一个调试ajax什么时候&#xff0c;然后&#xff0c;我不知道怎么用&#xff0c;你知道写的路径来调用&#xff0c;总是提示404错&#xff0c;&#xff0c;到最后自己一点点的调通了&#xff0c;知道servlet是须要serve…

vc++ 提取网页上的文字_网页内容不让你复制?老师傅教的这招太绝了,1键提取全网文字...

在网上冲浪&#xff0c;看到了一些不错的文字&#xff0c;想要复制下来&#xff0c;可是网站就不让你复制&#xff0c;非要你注册登录账号&#xff0c;更有甚者要你购买VIP才能复制文字&#xff0c;这不是天方夜谭吗&#xff1f;今天老师傅就教你一招&#xff0c;学会了网页文字…

使用 C# 生成 EMF 矢量图形文件

前言公众号上有网友询问我如何生成 EMF 文件的问题&#xff1a;本以为非常简单&#xff0c;我快速给出了解决方案&#xff1a;var bitmap new Bitmap(640, 480);var g Graphics.FromImage(bitmap);g.DrawString("My IO", new Font(FontFamily.GenericSerif, 10), B…

php register_shutdown_function响应error 配合error_get_last 捕获错误

register_shutdown_function 函数,当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,我们的这个函数将会 被调用&#xff0c;可以配合 error_get_last 使用&#xff0c;代码如下&#xff0c;注释已经解释了代码了&#xff1a; error_get_last 稍后解释 <?php //a bo…

嵌入式开发linux工具,嵌入式Linux开发入门之MfgTool工具的使用

介绍嵌入式linux开发的环境搭建&#xff1a;一、PC端环境搭建2、Ubuntu装好后&#xff0c;在终端安装minicom工具&#xff0c;安装命令&#xff1a;sudo apt-get install minicom注&#xff1a;该工具在后面烧录开发板可以调试使用&#xff0c;对以后的嵌入式程序开发也是不可获…

SQL Server 2005 cmd工具的使用

您可以使用 sqlcmd 实用工具(Microsoft Win32 命令提示实用工具)来运行特殊的 Transact-SQL 语句和脚本。若要以交互方式使用 sqlcmd,或要生成可使用 sqlcmd 来运行的脚本文件,则需要了解 Transact-SQL。通常以下列方式使用 sqlcmd 实用工具: 在 sqlcmd 环境中,以交互的方…

剑指offer之按层打印树节点

1 问题 按层打印树节点&#xff0c;比如我们有树如下 23 5 1 4 2 3 这样打印&#xff1a;2 3 5 1 4 2 3 2 分析 队列&#xff1a;先进后出&#xff0c;这里我们先打印2&#xff0c;然后再打印3和5&#xff0c;我们这里可以使用队列&#xff0c;我们先把2入队…

基于key/value+Hadoop HDFS 设计的存储系统的shell命令接口

对于hadoop HDFS 中的全部命令进行解析&#xff08;当中操作流程是自己的想法有不允许见欢迎大家指正&#xff09; 接口名称 功能 操作流程 get 将文件拷贝到本地文件系统 。假设指定了多个源文件&#xff0c;本地目的端必须是一个文件夹。 &#xff08;1&#xff09;依照…

【足迹C++primer】52、,转换和继承虚函数

转换和继承,虚函数 Understanding conversions between base and derived classes is essential to understanding how object-oriented programming works in C. 理解基类和派生类之间的转换是不可缺少的 理解面向对象编程在。 Like built-in pointers, the smart pointer cla…

python人脸识别训练模型生产_深度学习-人脸识别DFACE模型pytorch训练(二)

首先介绍一下MTCNN的网络结构&#xff0c;MTCNN有三种网络&#xff0c;训练网络的时候需要通过三部分分别进行&#xff0c;每一层网络都依赖前一层网络产生训练数据供当前训练网络&#xff0c;这样也推动了两个网络之间的最小损耗。PnetRnetOnetMTCNN的人脸模型按照以上结构按照…

聊一聊Redis的离线分析

背景 Redis 或许是我们大部分场景都会用到的一个利器&#xff0c;虽然是利器&#xff0c;用的姿势不对的话&#xff0c;终究还是会整出幺蛾子的。比较常见的问题&#xff0c;不外乎内存暴增&#xff0c;慢查询等情况。那么对于内存问题&#xff0c;可以借助redis自带的bigkey分…

C# 实现Winform全屏后不遮挡任务栏,显示任务栏

最近在忙中抽闲&#xff0c;看我的桌面太过死了&#xff0c;不生动&#xff0c;不可爱。。。 然后默默的想写一个动态桌面的一个小东西活泼一下。。。 随后拿起来了N久不碰的C#&#xff08;本人C#渣&#xff0c;不&#xff0c;应该说什么都渣。。。&#xff09; 结果在winfo…

SQL Server 2005登录名,用户名,角色,架构之间的关系

SQL Server 2005对2000进行了很大的改进,而用户关系这部分也变得相当复杂了,很多朋友都对此一知半解!下面,我将把我应用中总结的和大家分享下,先从概念入手,希望对不理解的朋友有点提示。 今天我们要说的包括服务器登录名ServerLogin,服务器角色Server Role,数据库用户…

【模拟】【codeforces】599B Spongebob and Joke

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id282385 就是一个人最开始有一串数a1 a2 ... am 他的熊孩子队友用一组函数f1 f2 ... fn 以及bi fai 把串A换成了串B 现在告诉你B和F&#xff0c;让你把A换回来&#xff0c;能换回来输出A&#xff0c;换回来可能有…

linux磁盘第一个扇区分析,Linux磁盘分区

一、磁盘连接方式与设备文件名的关系计算机常见的磁盘接口有两种&#xff0c;分别是IDE与SATA接口&#xff0c;目前主流接口已经是SATA接口了。一个IDE扁平电缆可以连接两个IDE设备&#xff0c;通常主机又都会提供两个IDE接口&#xff0c;因此最多可以接到四个IDE设备。也就是说…

剑指offer之分行从上到下打印二叉树

1 题目 分行从上到下打印二叉树 23 5 1 4 2 3 我们打印如下 23 51 4 2 3 2 分析 之前这篇博客写了通过队列按层打印剑指offer之按层打印树节点 现在无非就是还要按照条件打印&#xff0c;第一次打印1个&#xff0c;然后第二次打印2个&…