C#学习笔记--由浅至深理解IEnumerable和IEnumerator

news2024/10/6 10:40:36

目录

    • 前言
    • 总结 IEnumerable 和 IEnumerator
      • IEnumerable是什么?
      • IEnumerator是什么?
      • 总结
    • 结尾预告

前言

上篇文章我是自己实现了一个容器C#学习笔记–实现一个可以重复权重并且能够自动排序的容器–MultiplySortedSet

写完之后突然想到一个问题,容器到底是怎么遍历的?
for循环可以用下标来进行遍历数组,但是for循环怎么遍历无序集合呢?那就得用foreach了。
但是foreach又是怎么进行集合的遍历呢?既然是无序的,那是怎么找到下一个元素的?
带着这些问题,我来研究了下IEnumerableIEnumerator

总结 IEnumerable 和 IEnumerator

IEnumerable是什么?

我们来看看C#的定义

namespace System.Collections
{
    public interface IEnumerable
    {
        IEnumerator GetEnumerator();
    }
}

简单来说,IEnumerable接口定义了一个GetEnumerator方法,该方法返回一个实现了IEnumerator接口的对象。

第一次看肯定看不懂,不过我们可以试着翻译

  • IEnumerable:可被迭代的
  • Enumerator:迭代器

我们再来看看ListDictionary

public class List<T> : ICollection<T>, IEnumerable<T>, IEnumerable, IList<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection, IList
public class Dictionary<TKey, TValue> : ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable, IDictionary<TKey, TValue>, IReadOnlyCollection<KeyValuePair<TKey, TValue>>, IReadOnlyDictionary<TKey, TValue>, ICollection, IDictionary, IDeserializationCallback, ISerializable

ListDictionary是可以被foreach循环遍历的,原因就是它们实现了IEnumerable < T > IEnumerable接口。

说了这些,也没有说到底是怎么遍历的呀?
不急,我们再来看看IEnumerator

IEnumerator是什么?

老样子,先看C#定义

namespace System.Collections
{
    public interface IEnumerator
    {
        object Current { get; }

        bool MoveNext();
        void Reset();
    }
}

我们来看两个东西

  • object Current { get; }
  • bool MoveNext();

MoveNext,翻译过来就是移动到下一个。
Current其实就是当前的值。

多说无益,直接写个程序来看看

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    private void Awake()
    {
        int[] array = new int[3] { 1, 2, 3 };
        var it = array.GetEnumerator();//获取对象的迭代器

        while (it.MoveNext())
        {
            print(it.Current);
        }
    }
}

在这里插入图片描述
内部原理其实是这样的,下方是伪代码

private int index = -1;
private int[] array;

public int Current
{
    get
    {
    	if(index == -1) return null;
        return array[index];
    }
}

public bool MoveNext()
{
	if(index < array.Length)
	{
		index++;
		return true;
	}
	else
	{
		return false;
	}
}

迭代器内部有一个指针(当然这个指针不一定是C++中的指针,只是一种表达方式,当然这个指针也可以是数组的下标:index

在我们的上个例子中,初始的时候指针指向空。也就是 index 指向-1,此时 Currentnull
在这里插入图片描述
当我们调用MoveNext的时候。也就是 index 指向0,此时 Current1
在这里插入图片描述
然后一直调用MoveNext

index = 2 的时候,也就是指向元素 3 的时候
在这里插入图片描述

我们再次调用MoveNext,发现没有下一个元素了,此时MoveNext返回false
那么while循环就被终止了。

总结

  • IEnumerable接口定义了一个GetEnumerator方法,该方法返回一个实现了IEnumerator接口的对象。
  • IEnumerator接口定义了用于遍历序列的方法,例如MoveNextCurrent

结尾预告

下篇文章我们来研究下foreach循环到底是怎么遍历容器的

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

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

相关文章

PMP课堂模拟题目及解析(第6期)

51. 管理层将一个国际项目分配给一位新项目经理。这是该项目经理第一次与团队合作&#xff0c;团队成员位于两个国家&#xff0c;数量平均分布&#xff0c;一个团队由最合适作为个人工作的成员组成&#xff0c;另一个团队由最适合作为团队工作的成员组成。项目经理该怎么做&am…

抖音商城小程序搭建的注意事项

抖音商城小程序已经成为了越来越多电商企业的选择&#xff0c;毕竟它具有强大的用户资源和社交传播力。但是&#xff0c;在搭建抖音商城小程序的过程中&#xff0c;还有一些需要注意的事项。 1、制定明确的策略和目标 在搭建抖音商城小程序前&#xff0c;必须事先制定明确的策…

65.网站个性框架

之前介绍过集中个性网站 严肃优雅型极简主义普通/中性大胆/自信平静祥和创业/上进俏皮/好玩 严肃优雅型 概述 奢华和优雅的设计&#xff0c;基于细小的衬线字体、金色或粉色的颜色和高质量的大图片。 行业 房地产、高端时尚、饰品类&#xff0c;奢侈产品或服务 排版 有衬…

(构造函数的补充2)类型转换与临时变量(新对象)的生成与explicit关键字,类的静态成员变量与成员函数及其应用

(构造函数的补充2)类型转换与临时变量(新对象)的生成与explicit关键字 如果说一个构造函数是单个参数&#xff0c;或者说有多个参数但是第一个参数没有默认值&#xff0c;而其余均有默认值&#xff0c;这时候就特别需要注意类型转换的问题。首先必须得知道的一点就是说一旦有类…

Vue中的键盘事件

目录 一、Vue中的键盘事件的类型 二、keycode指定具体的按键 三、Vue中常用的按键别名 四、Vue自定义按键 五、实现多个按键一起触发事件 一、Vue中的键盘事件的类型 keydown:键盘按下就会触发 keyup:键盘抬起就会触发 二、keycode指定具体的按键 在键盘中&#xff0c;每一…

JMeter测试工具设置中文

JMeter测试工具设置中文 在JMeter中&#xff0c;默认情况下是英文的&#xff0c;如果需要使用中文进行测试&#xff0c;则需要进行如下设置&#xff1a; 第一步、设置JMeter语言选项 在JMeter运行时界面的“Options”菜单中&#xff0c;选择“Choose Language”&#xff0c;…

2023.05.10- 使用Loopback Scaler来改善Stable Diffusion的绘图效果

简介 Loopback Scaler可以添加画面细节 渣图挽救者&#xff1a;在图生图中对原图迭代重绘&#xff0c;修复渣图。脚本在多个循环中处理输入图像&#xff0c;每个循环提高分辨率并优化图像质量。然后&#xff0c;一个循环的图像结果作为下一个循环的输入图像插入&#xff0c;该…

FE_Vue框架的执行流程详解

1 分析脚手架结构 2 整个流程 执行npm run serve&#xff0c;随后来到src中找到【整个项目的入口文件】main.js&#xff0c;这个js页面中引入了Vue、App.vue、关闭了提示等。 // ps: 该文件是整个项目的入口文件 // step1 引入Vue import Vue from vue // step2 引入App组件-…

Android9.0 Charles 模拟器抓包

目录 只想做条安静的咸鱼&#xff0c;混吃等死又一天 一、下载并安装配置Charles 二、下载安装Postern 三、测试抓包 一、下载并安装配置Charles 1.Charles下载网址&#x1f447; Charles Web Debugging Proxy • HTTP Monitor / HTTP Proxy / HTTPS & SSL Proxy / Rev…

EasyPoi导出,设置不同列的字体颜色(修改easypoi 3.1.0版本源码)

声明&#xff1a;代码以esaypoi 3.1.0版本为基础&#xff0c;基本上新的代码都是直接copy源码的&#xff0c;只是稍微修改了源码&#xff1b;仍然需要导入该依赖是 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifac…

数据建模三范式说明

三范式&#xff1a; 1.原子性&#xff1a;属性不可分割 2.唯一性&#xff1a;不能存在部分依赖 3.非冗余性&#xff1a;要求任何字段不能由其他字段派生出来、确保每列都和主键列直接相关,而不是间接相关)

案例|九江银行Zabbix监控系统实践

Zabbix监控平台建设历程 九江银行Zabbix监控系统实践&#xff0c;共分为三个部分&#xff1a; 1.Zabbix监控平台的建设历程 2.Zabbix实践经验分享 3.对未来监控的展望。 项目背景 建立新的一体化基础监控平台。为适应数字化转型的需要、新技术发展的需要及业务连续性的需…

关于使用Lombok的注意事项

文章目录 1、Lombok简介2、使用Lombok的问题2.1 驼峰问题2.2 相同的字符串不同的大小写 3、关于使用Lombok的总结4、写在最后 1、Lombok简介 Lombok项目是一个Java库&#xff0c;它会自动插入您的编辑器和构建工具中&#xff0c;从而为你优化Java代码。通过注解的方式代替我们手…

注入攻击(二)--------HTML(有源码)

前序文章 注入攻击&#xff08;一&#xff09;--------SQL注入(结合BUUCTF sqli-labs) 目录 示例网站搭建1.搭建LAMP开发环境1. MySQL2. PHP3. Apache 写在示例前示例1.反射型HTML注入页面效果源码 示例2.钓鱼表单页面效果源码 示例3.存储型HTML注入页面效果源码 示例网站搭建 …

【Docker】使用 Docker 部署 Maven 仓库

在本文中&#xff0c;将介绍如何使用 Docker 部署一个 Maven 本地私服。Maven 私服可以帮助我们管理和共享本地的 Maven 依赖&#xff0c;提高开发效率。本文将使用 Sonatype Nexus 作为 Maven 私服&#xff0c;并使用 Docker Compose 来部署和管理容器。 准备工作 在开始之前…

mysql数据库在windows服务器下安装

一、mysql安装包下载 官网下载地址&#xff1a;mysql安装包下载 如图所示&#xff1a; 二、配置my.ini文件 解压后的文件尽量不要放在C盘&#xff08;内存小&#xff09;&#xff0c;解压后如下图所示 在上图所示根目录下配置my.ini文件 1、右键创建一个文本&#xff08;.text…

pikachu靶场-Unsafe Upfileupload

文件上传漏洞简述 什么是文件上传漏洞&#xff1f;  ​ 凡是存在文件上传的地方均有可能存在文件上传漏洞&#xff0c;关于上传文件操作的时候对方代码写的是否完整、是否安全&#xff0c;一旦疏忽了某个地方可能会造成文件上传漏洞。 文件上传的原理 网站Web应用都有一些文件…

1.SpringBoot基础篇

SpringBoot 文档更新日志 版本更新日期操作描述v1.02021/11/14A基础篇 前言 ​ 很荣幸有机会能以这样的形式和互联网上的各位小伙伴一起学习交流技术课程&#xff0c;这次给大家带来的是Spring家族中比较重要的一门技术课程——SpringBoot。一句话介绍这个技术&#xff0c;…

华为pbr双出口外线,指定内网单个vlan绑定单个出口外线上网

公司两条外线&#xff0c;vlan 10用nat走上面转发出去上网&#xff0c;vlan 20 走下面那条外线出去nat上网 AR2&#xff1a; interface GigabitEthernet0/0/0 ip address 6.6.6.1 255.255.255.0 interface GigabitEthernet0/0/1 ip address 154.1.2.3 255.255.255.0 interface…

Python+Selenium4环境搭建

set集合 怎么把列表种相同的数据和不同的数据取出来 1.把列表转为set集合 2.按照集合的交集 selenium 自动化测试&#xff1a;自动化测试就是通过代码或者是工具模拟人的行为来进行对WEB&#xff08;APP&#xff09;来进行操作。 QTP (HP公司)&#xff1a;以录制回放的模式…