C#高级 09 IEnumerable可枚举类型--可迭代类型

news2024/11/19 11:31:12

了解Linq操作需先了解IEnumerable可枚举类型–可迭代类型,因为Linq中的很多函数的返回值类型和传入的形参类型都是IEnumerable的。

IEnumerable可枚举类型–可迭代类型
只要一个类型实现了IEnumerable接口,就可以对这个类型进行遍历。

首选来看IEnumerable接口有一个需要实现的方法 GetEnumerator(),它的返回值类型是IEnumerator接口类型的,然后继续深入进去查看IEnumerator接口。
在这里插入图片描述

如图IEnumerator接口内部分为三部分:object类型的属性值和两个bool类型的方法
在这里插入图片描述

所以当我们使用IEnumerable时,将一个类继承它,然后需要实现一个返回值类型为IEnumerator类型的GetEnumerator()方法。给出示例代码如下所示:

class Student : IEnumerable
{
    public int Id { get; set; }
    public IEnumerator GetEnumerator()
    {
        // yield关键词他是一个迭代器,相当于实现了IEnumerator枚举器
        //yield return "Ant编程1";
        //yield return "Ant编程2";
        //yield return "Ant编程3";
        string[] student = { "Ant编程1", "Ant编程2", "Ant编程3" };
        return new StudentEnumerator(student);
    }    
}

 internal class StudentEnumerator : IEnumerator
 {
     string[] _student;
     int _position = -1;

     public StudentEnumerator(string[] student)
     {
         this._student = student;
     }

     public object Current
     {
         get 
         {
             if (_position == -1)
             {
                 throw new InvalidOperationException();
             }
             if (_position >= _student.Length)
             {
                 throw new InvalidOperationException();
             }
             return _student[_position];
         }
     }


     public bool MoveNext()     //就是让我们把操作推进到下一个
     {
         if (_position < _student.Length - 1)
         {
             _position++;
             return true;
         }
         else
         {
             return false;
         }
     }

     public void Reset() 
     {
         _position = -1;
     } 
 }

上述代码中,Student 类继承了IEnumerable接口,并实现了其中的GetEnumerator()。
GetEnumerator()返回为 new StudentEnumerator(student)是一个返回值为 IEnumerator的对象;
StudentEnumerator类集成了IEnumerator接口,实现了Current属性和MoveNext()和Reset()方法。

现在只需要在main函数中遍历Student对象,就可以看到IEnumerable枚举类型内部遍历的过程,示例代码如下:

internal class Program
{
    static void Main(string[] args)
    {
        int[] array = { 1, 2, 3, 4, 5 };
        int i = 1;
        string str = "Ant编程";
        Student student = new Student { Id = 1 };

        foreach (var item in student)
        {
            Console.WriteLine(item);
        }
        Console.ReadKey();
    }
}

这里在foreach遍历时,会先进入IEnumerable接口实现类的GetEnumerator()的返回值为IEnumerator接口类型的实现方法的MoveNext()内后,再继续下一步遍历。

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

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

相关文章

力扣题:高精度运算-1.4

力扣题-1.4 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;306. 累加数 解题思想&#xff1a;首先先通过secondStart和secondEnd可以确定num1 num[0:secondStart],num2 num[secondStart:secondEnd]&#xff0c;然后遍历secondStart和secondEnd…

理解二叉树的遍历(算法村第七关白银挑战)

二叉树的前序遍历 144. 二叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09; 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]解 LeetCode以及面试中提供的方法可能…

如何使用WebSecProbe对Web应用程序执行复杂的网络安全评估

关于WebSecProbe WebSecProbe是一款功能强大的Web应用程序网络安全评估工具&#xff0c;该工具专为网络安全爱好者、渗透测试人员和系统管理员设计&#xff0c;可以执行精确而深入的复杂网络安全评估。 该工具简化了审查网络服务器和应用程序的复杂过程&#xff0c;允许广大研…

计算机创新协会冬令营——暴力枚举题目06

我给大家第一阶段的最后一道题就到这里了&#xff0c;下次得过段时间了。所以这道题简单一点。但是足够经典 下述题目描述和示例均来自力扣&#xff1a;两数之和 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target …

CAVER: Cross-Modal View-Mixed Transformer for Bi-Modal Salient Object Detection

目录 一、论文阅读笔记&#xff1a; 1、摘要&#xff1a; 2、主要贡献点&#xff1a; 3、方法&#xff1a; 3.1 网络的总体框架图&#xff1a; 3.2 Transformer-based Information Propagation Path (TIPP) 3.3 Intra-Modal/Cross-Scale Self-Attention (IMSA/CSSA) Q1…

谷歌Google插件离线导出、安装

离线导出&#xff1a; 1.进入当前用户路径下&#xff1a; %userprofile%\AppData\Local\Google\Chrome\User Data\Default\Extensions 2.详情查看ID,即对应上述文件夹路径下插件文件名&#xff01; 3.压缩成ZIP包! 离线导入&#xff1a; 1.打开开发者模式 2.导入上述解压的压…

MySQL基础笔记(5)DCL数据控制语句

数据控制语句&#xff0c;用来管理数据库用户、控制数据库的访问权限~ 目录 一.用户管理 1.查询用户 2.创建用户 3.修改用户密码 4.删除用户 二.权限管理 1.查询权限 2.授予权限 3.撤销权限 一.用户管理 1.查询用户 use MySQL; select * from user; 2.创建用户 crea…

【C/C++】轻量级跨平台 开源串口库 CSerialPort

文章目录 1、简介2、支持的平台3、已经支持的功能4、Linux下使用5、使用vcpkg安装CSerialPort6、交叉编译7、效果图8、基于CSerialPort的应用8.1、CommMaster通信大师8.2、CommLite串口调试器 1、简介 Qt 的QSerialPort 已经是跨平台的解决方案&#xff0c;但Qt开发后端需要 Q…

高性价比的高速吹风机/高速风筒解决方案,基于普冉单片机开发

高速吹风机是今年非常火的一款产品&#xff0c;快速崛起并颠覆了传统吹风机&#xff0c;高速吹风机也成为了传统吹风机替代的一个大趋势。高速吹风机是利用高转速产生的大风量来快速吹干头发&#xff0c;由于其精巧的外观设计、超低的噪声、出色的干发效果&#xff0c;高速吹风…

篇二:springboot2.7 OAuth2 server使用jdbc存储RegisteredClient

上一篇 <<springboot 2.7 oauth server配置源码走读一>>中简单描述了oauth2 server的配置&#xff0c;其中使用了内存保存 RegisteredClient&#xff0c;本篇改用mysql存储。 db存储需要创建表&#xff0c;表结构应该是什么样的呢&#xff0c;从spring给我们封装好…

国际光伏展

国际光伏展是一个专门展示和推广光伏技术和产品的国际性展览会。光伏技术是一种利用光能转化为电能的技术&#xff0c;被广泛应用于太阳能发电系统和其他可再生能源系统中。国际光伏展汇集了来自全球的光伏企业、研究机构和专业人士&#xff0c;展示最新的光伏产品、技术和解决…

量子经济应用新道路!德国旗舰项目PlanQK首次公布研究成果

&#xff08;图片来源&#xff1a;网络&#xff09; 作为人工智能创新竞赛的一部分&#xff0c;由量子开放平台和生态系统公司Anaqor AG与斯图加特大学牵头、联邦经济事务和气候保护部资助的PlanQK研究项目&#xff0c;经过四年的深入研究&#xff0c;于近期公布了其研究成果&…

圣诞节来临,如何用海外云手机给亚马逊店铺引流?

马上就要到圣诞节了&#xff0c;这是一年中冲刺销售量的最后一个好机会&#xff0c;对所有亚马逊卖家都十分重要。而无论是亚马逊新手卖家还是老卖家&#xff0c;要想在激烈的竞争中取胜&#xff0c;仅仅靠产品本身是不现实的&#xff0c;通过测评和社媒引流获取更多曝光和流量…

如何使用 NFTScan NFT API 在 PlatON 网络上开发 Web3 应用

PlatON 是由万向区块链和矩阵元主导开发的面向下一代的全球计算架构&#xff0c;创新性的采用元计算框架 Monad 和基于 Reload 覆盖网络的同构多链架构&#xff0c;其愿景是成为全球首个提供完备隐私保护能力的运营服务网络。它提供计算、存储、通讯服务&#xff0c;并提供算力…

淘宝以图搜商品API调用详细步骤(apiKeysecret)

以图片来搜索商品是电商平台常见的一个功能&#xff0c;一般用于搜索同款、找爆品、淘宝拍立淘等功能。 通过item_search_img可以实现通过图片来搜索同款商品列表&#xff0c;响应参数包括宝贝标题、列表类型、宝贝图片、优惠价、价格、销量、宝贝ID、商品风格标识ID、掌柜昵称…

数据结构—图(上)

文章目录 12.图(上)(1).图的基本概念#1.图的基本定义#2.边的分类#3.数据结构的一些规定#4.子图#5.完全图#6.路径#7.连通性和连通分量#8.度 (2).图的存储方式#1.邻接矩阵#2.邻接表 (3).图的遍历#1.深度优先搜索(Depth First Search)i.走个迷宫ii.DFS的思想iii.代码实现 #2.广度优…

Linux:apache优化(3)—— 页面缓存时间

作用&#xff1a;通过 mod_expires 模块配置 Apache&#xff0c;使网页能在客户端浏览器缓存一段时间&#xff0c;以避免重复请求&#xff0c;减轻服务端工作压力。启用 mod_expires 模块后&#xff0c;会自动生成页面头部信息中的 Expires 标签和 CacheControl 标签&#xff0…

COCO Dataset Format

COCO (Common Objects in Context) dataset数据集是一个广泛应用于目标检测、语义分割的数据集&#xff0c;包含330K 图片数据 与 2.5 million 个目标实体。 1.数据集下载 !wget http://images.cocodataset.org/zips/train2017.zip -O coco_train2017.zip !wget http://image…

宝塔面板yum安装指南

1、执行 yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec2、QA 提示抱歉&#xff0c;连接宝塔官网失败&#xff0c;请切换节点后重试服务器终端 分别执行这2条命令 mv /www/server/pa…

1.4 day4 IO进程线程

使用两个子进程进行文件拷贝&#xff0c;父进程进行资源回收 #include <myhead.h> int main(int argc, const char *argv[]) {//创建一个文件描述符并以只读的方式打开int fd-1;if((fdopen("./test.bmp",O_RDONLY))-1){perror("open error");return…