2021年了,`IEnumerator`、`IEnumerable`接口还傻傻分不清楚?

IEnumeratorIEnumerable这两个接口单词相近、含义相关,傻傻分不清楚。
入行多年,一直没有系统性梳理这对李逵李鬼。

最近本人在怼着why神的《其实吧,LRU也就那么回事》,方案1使用数组实现LRU,手写算法涉及这一对接口,借此时机覆盖这一对难缠的冤家。

IEnumerator

IEnumerator、IEnumerable接口有相似的名称,这两个接口通常也在一起使用,它们有不同的用途。

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

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

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

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

IEnumerable

IEnumerable接口为foreach迭代提供了支持,IEnumerable要求你实现GetEnumerator方法。

public IEnumerator GetEnumerator()
{return (IEnumerator)this;
}

该用哪一个接口?

仅凭以上辞藻,很难区分两个接口的使用场景。

IEnumerator接口定义对类中的集合类型对象的迭代方式

IEnumerable接口允许使用foreach循环进行枚举。

因此IEnumerable接口的GetEnumerator方法会返回一个IEnumerator接口。要实现IEnumerable,你还必须实现IEnumerator

从英文词根上讲:
IEnumerator接口代表了枚举器,里面定义了枚举方式,是名词。
IEnumerable接口代表该对象具备了可被枚举的性质,是形容词。

总之,如果您想提供对foreach的支持,那么就先让对象可枚举,再谈论枚举方式,也就是说实现这两个接口。

最佳实践

  • 在嵌套类中实现IEnumerator,这样你可以创建多个枚举器。

  • 为IEnumerator的Current方法提供异常处理。
    为什么要这么做?
    如果集合的内容发生变化,则reset方法将被调用,紧接着当前枚举数无效,您将收到一个IndexOutOfRangeException异常(其他情况也可能导致此异常)。所以执行一个Try…Catch块来捕获这个异常并引发InvalidOperationException异常, 提示在迭代时不允许修改集合内容。

这也正是我们常见的在foreach 里面尝试修改迭代对象会报InvalidOperationException异常的原因。

下面以汽车列表为例实现IEnumerator IEnumerable接口

using System;
using System.Collections;
namespace ConsoleEnum
{public class cars : IEnumerable{private car[] carlist;//Create internal array in constructor.public cars(){carlist= new car[6]{new car("Ford",1992),new car("Fiat",1988),new car("Buick",1932),new car("Ford",1932),new car("Dodge",1999),new car("Honda",1977)};}//private enumerator classprivate class  MyEnumerator:IEnumerator{public car[] carlist;int position = -1;//constructorpublic MyEnumerator(car[] list){carlist=list;}private IEnumerator getEnumerator(){return (IEnumerator)this;}//IEnumeratorpublic bool MoveNext(){position++;return (position < carlist.Length);}//IEnumeratorpublic void Reset(){position = -1;}//IEnumeratorpublic object Current{get{try{return carlist[position];}catch (IndexOutOfRangeException){throw new InvalidOperationException();}}}}  //end nested classpublic IEnumerator GetEnumerator(){return new MyEnumerator(carlist);}}
}

foreach cars的时候,可以明显看到

  • foreach语法糖初次接触可枚举的cars, 实际会访问cars实现的 GetEnumerator()方法,拿到迭代器

  • foreach每次迭代,实际会访问迭代器的Current属性

关注并星标我们
更多干货及最佳实践分享

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

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

相关文章

vs.Net2003无法打开或创建Web应用程序若干解决办法

昨天到今天搞了一整天,把人都要差点搞崩了! ,以后再也不能乱关机了,因为这次的大意,几乎所有的Net安装&#xff0c;调试问题都被我碰到了&#xff0c;还好&#xff0c;我一个个把他记录下来了&#xff0c;同时&#xff0c;在CSDN找了一些相关的解决方法&#xff0c;不敢独享&am…

linux管理Windows文件,Linux与Windows互传文件,用户组管理和用户管理

一、与Windows互传文件linux和windows互传文件&#xff0c;需要使用Xshell&#xff0c;Linux系统需要安装lrzsz包。yum install -y lrzsz //linux安装lrzsz包# sz a.txt //Linux端传输当前目录下的a.txt到windows# rz //windows端选择传输文件到Linux当前目前二、/etc/passwd和…

浅谈​与彼得原理和责任管理有关的小故事

浅谈与彼得原理和责任管理有关的小故事一&#xff09;老王虽然今年才3年工作经验&#xff0c;但一直深受领导赏识&#xff0c;因为在大家眼里他是一个责任心特别强的人。无论是领导也好&#xff0c;同事也好&#xff0c;只要有任务安排给他&#xff0c;他都会非常欣然的接受&am…

分布式防火墙技术及主要特点

随着网络的发展和普及&#xff0c;特别是互联网应用的飞速发展和普及&#xff0c;网络安全越来越受到各级用户的普遍关注。人们在享受信息化带来的众多好处的同时&#xff0c;也面临着日益突出的信息安全问题。比如&#xff1a;网络环境中国家秘密和商业秘密的保护&#xff0c;…

微软向Chromium贡献代码以优化浏览器滚动体验

喜欢就关注我们吧&#xff01;近日&#xff0c;微软为 Chromium 社区提交了一个新功能&#xff0c;用于解决以 Chromium 为内核的浏览器在 Windows 10 中滚动响应不够流畅的问题。据悉&#xff0c;Chrome 浏览器在访问某些网站并滚动时会出现抖动的情况&#xff0c;导致其在部分…

armv7的linux系统,CentOS 7(1611) for ARM(armhfp)发布

需要注意的是&#xff0c;ARM版CentOS 7.3.1611是从Red Hat Enterprise Linux 7.3系统中派生出来的&#xff0c;这就意味着操作系统能够兼容上层系统。尽管CentOS 7 Userland for armhfp来自于CentOS 7 GNU/Linux发行版本&#xff0c;但是部分预安装包已经移除&#xff0c;或者…

proftpd的配置

下载proftp最新版。下载地址&#xff1a;[url]ftp://ftp.proftpd.org/distrib/source/[/url]二、安装tar zxvf proftpd*.gz //解压文件。cd proftpd* //考虑到版本不同&#xff0c;所以我用“ * ”代替后面的字符。.…

[C#.NET 拾遗补漏]14:使用结构体实现共用体

在 C 和 C# 编程语言中&#xff0c;结构体&#xff08;Struct&#xff09;是值类型数据结构&#xff0c;它使得一个单一变量可以存储多种类型的相关数据。在 C 语言中还有一种和结构体非常类似的语法&#xff0c;叫共用体&#xff08;Union&#xff09;&#xff0c;有时也被直译…

linux新建文件夹灰色,Ubuntu新建文件夹灰了

#问题描述&#xff1a;WIn10Ubuntu双系统&#xff0c;其中WIn10系统和Ubuntu的目录“/”和“/boot”在同一块固态中&#xff0c;剩余的其他文件都在另一块机械硬盘里面。在机械硬盘下的软件(E&#xff1a;&分区5)和文档(F&#xff1a;&分区6)盘中无法新建文件夹&#x…

右击硬盘分区第一项出现Auto的解决办法

最近网上相信有不少的网友和我一样都中了这种病毒&#xff0e;就是说在右键单击你的硬盘的时候第一项不是打开而是&#xff21;&#xff35;&#xff34;&#xff2f;这个选项&#xff0e;而要想在这种情况下打开的话&#xff0c;就必须用右键单击打开&#xff0c;让我们心理真…

使用 C# 9 的records作为强类型ID - 初次使用

强类型ID实体通常是整数&#xff0c;GUID或者string类型&#xff0c;因为数据库直接支持这些类型&#xff0c;但是&#xff0c;如果实体的ID的类型是一样的&#xff0c;比如都是整数的ID&#xff0c;这有可能会出现ID值传错的问题&#xff0c;看下边的示例。public void AddPro…

linux配置文件引用时间,linux时间设置、screen使用、命令分类、hash作用、命令引用及history命令...

一、 生产环境发现一台服务器系统时间产生偏差&#xff0c;造成服务异常解决方法a、 如果服务器硬件时间准备的话&#xff0c;可使用命令&#xff1a;~#] hwclock -s将硬件时钟同步到系统b、date [MMDDhhmm[[CC]YY][.ss]] 分别为&#xff1a;月日小时分年.秒eg:~]# date 101420…

用拖拉实现设备驱动配置(EsayHMI最新驱动配置方式)

以前的IOServer 是用VB6开发&#xff0c;驱动的配置方式和一般的组态软件没有什么很大的区别&#xff0c;配置起来比较麻烦&#xff0c;对一般的生手来说&#xff0c;要费一番功夫才能配置完毕。 总觉得原有的程序和目前的HMI图元配置环境格格不入&#xff0c;所以重新编写了驱…

HttpClientFactory 结合 Polly 轻松实现重试机制

HttpClientFactory 结合 Polly 轻松实现重试机制Intro我们的服务里有一个 API 会去调用第三方的接口&#xff0c;设置了超时时间&#xff0c;最近偶尔会发生超时的情况&#xff0c;微软在提供 HttpClientFactory 的同时&#xff0c;也提供了一个基于 Polly 的一个扩展&#xff…

ASP.NET 状态管理概览

页面每次被回传到服务器的时候都会创建 Web 页面类的一个新实例。在传统的 Web 开发中&#xff0c;这意味着在每次回传的过程中&#xff0c;页面中所有与页面和控件相关联的信息都将被丢失。例如&#xff0c;如果用户在一个文本框中输入了信息&#xff0c;那么在浏览器或者其他…

linux udp端口大数据包,Linux协议栈中UDP数据报从网卡到用户空间流程总结

NAPI驱动流程&#xff1a;中断发生-->确定中断原因是数据接收完毕(中断原因也可能是发送完毕&#xff0c;DMA完毕&#xff0c;甚至是中断通道上的其他设备中断)-->通过netif_rx_schedule将驱动自己的napi结构加入softnet_data的poll_list链表&#xff0c;禁用网卡中断&am…

浅谈.NET技术公司的实习生培养

浅谈.NET技术公司的实习生培养背景近几年.NET开发者市场的越发不景气&#xff0c;一毕业就选择.NET技术的开发者更是少之又少。一方面是公司效益的日益提高&#xff0c;一方面却是招聘优秀人才的速度总是赶不上公司发展的速度&#xff0c;这样的矛盾不断的倾轧着技术管理者的内…

禁止自动播放功能

运行gpedit.msc打开组策略&#xff0c;在“管理模板--系统”右侧双击“关闭自动播放”&#xff0c;然后设置为“已启用”&#xff0c;并在“关闭自动播放”下拉列表中选择“所有驱动器”&#xff0c;最后“确定”即可。这个设置在“计算机配置”和“用户配置”中都有&#xff0…

MBR的Linux分区机制启动过程,linux系统启动流程(MBR)

总&#xff1a;POST---> Boot Squence ---> Bootloader ---> kernel ---> init---> 完成启动系统&#xff1a;CentOS61、按下电源&#xff0c;cpu找到CMOS中的BIOS并运行起来&#xff0c;这个小程序会完成硬件自检。BIOS&#xff1a;Basic Input and Output Sys…

.netcore 极速接入第三方登录

新年新气象&#xff0c;趁着新年的喜庆&#xff0c;肝了十来天&#xff0c;终于发了第一版&#xff0c;希望大家喜欢。如果有不喜欢看文字的童鞋&#xff0c;可以直接看下面的地址体验一下&#xff1a;Github: https://github.com/mrhuo/MrHuo.OAuth唯一官网&#xff1a;https:…