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

了解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()内后,再继续下一步遍历。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

体系化的进阶学习内容

UWA学堂&#xff1a;传播游戏行业的体系化的进阶学习内容。UWA学堂作为面向开发者的在线学习平台&#xff0c;目前已经上线272门课程&#xff0c;涵盖了3D引擎渲染、UI、逻辑代码等多个模块&#xff0c;拥有完整的学习体系&#xff0c;一直致力于为广大的开发者提供更丰富、更优…

BIND-DNS配置介绍

一、主要配置文件 /etc/named.conf options { //Option 段全部配置 listen-on port 53 { 127.0.0.1; };//表示BIND将在53端口监听&#xff0c;若需要对所有IP进行监听&#xff0c;则修改为// listen-on port 53 { any; }; directory "/var/named"…

解锁测试性能瓶颈:深度探讨JMeter分布式性能测试!

在做后端服务器性能测试中&#xff0c;我们会经常听到分布式。但你是否了解分布式呢&#xff1f;今天&#xff0c;我们就来给大家讲讲&#xff0c;在企业实战中&#xff0c;如何使用分布式进行性能测试&#xff0c;实战过程中&#xff0c;又有哪些地方要特别注意&#xff1f; 0…

书生·浦语大模型全链路开源体系 学习笔记 第一课

背景 大模型是发展人工通用人工智能的一个重要途径&#xff0c;能够解决多种任务和多种模态&#xff0c;展示了一个更面向更高阶的智能的潜在途径。大模型的发展历程是从专用模型到通用模型的过程&#xff0c;从语音识别、图像识别、人脸识别等专用模型&#xff0c;到通用的大…

大白话说区块链和通证

1 区块链 简单地说&#xff0c;区块链其实就像是一个不可篡改的分布式数据库&#xff0c;该分布式数据库记录了一系列交易或事件。区块链运行在至少1个以上的节点上&#xff0c;每个节点都有自己的一个分布式数据库&#xff0c;也就是分布式账本。正常情况下&#xff0c;每个节…

Python基础篇: 环境安装

Python基础环境使用 一&#xff1a;运行环境Anaconda介绍1、Anaconda搭建1.1、下载方式1.2、安装1.3、验证是否安装成功 2、管理python环境2.1、列出所有环境2.2、创建环境2.3、进入指定虚拟环境2.4、离开虚拟环境2.5、删除虚拟环境 3、依赖管理3.1、安装依赖3.2、卸载依赖3.3、…

[C#]winform部署PaddleDetection的yolo印章检测模型

【官方框架地址】 https://github.com/PaddlePaddle/PaddleDetection.git 【算法介绍】 PaddleDetection 是一个基于 PaddlePaddle&#xff08;飞桨&#xff09;深度学习框架的开源目标检测工具库。它提供了一系列先进的目标检测算法&#xff0c;包括但不限于 Faster R-CNN, …

Prometheus-Alertmanage钉钉实现告警

获取钉钉的webhook地址 1、注册企业钉钉 a、注册企业钉钉 浏览器打开钉钉注册页面 填入手机号码&#xff0c;填入获取到的验证码&#xff0c;点注册 填入企业资料并注册 注册成功后&#xff0c;扫描二维码下载钉钉&#xff0c;如下图&#xff1a; b、添加机器人 管理后台 因…

社科院与美国杜兰大学金融管理硕士项目——为金融领域人士照亮寒冬中的新机遇

随着全球金融市场的不断演变&#xff0c;金融领域的发展日新月异&#xff0c;充满了不确定性和挑战。特别是在当前的经济寒冬期&#xff0c;许多金融领域人士面临着巨大的压力和困境&#xff0c;需要寻找新的发展机遇和突破口。社科院与杜兰大学金融管理硕士项目如同明灯&#…

Java学习——设计模式——行为型模式1

文章目录 行为型模式模板方法策略模式命令模式责任链模式 行为型模式 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;涉及算法与对象间职责的分配。 行为型模式分为类行为模式和…

PHPStudy快速搭建网站并结合内网穿透远程访问本地站点

文章目录 [toc]使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2…

上门回收小程序开发的优势,顺应时代发展

当下&#xff0c;人们的生活水平不断提高&#xff0c;相应产生的闲置物品也在不断增加&#xff0c;回收行业因此得到了快速发展。 同时&#xff0c;在互联网的发展下&#xff0c;回收行业也慢慢转到了线上&#xff0c;人们在卖闲置物品时不需要到门店内&#xff0c;只需要在手…

x-cmd pkg | pdfcpu - 强大的 PDF 处理工具

目录 简介首次用户多功能支持性能表现安全的加密处理进一步阅读 简介 pdfcpu 是一个用 Go 编写的 PDF 处理库。同时它也提供 API 和 CLI。pdfcpu 提供了丰富的 PDF 操作功能&#xff0c;用户还能自己编写配置文件&#xff0c;用来管理和使用各种自定义字体并存储有效的默认配置…

【SpringCloud】设计原则之数据一致性与设计模式

一、设计原则之数据一致性 数据一致性分以下几种情况。 强一致性 当更新操作完成之后&#xff0c;任何多个后续进程或线程的访问都会返回最新的更新过的值。这种是对用户最友好的&#xff0c;就是用户上一次写什么&#xff0c;下一次就保证能读到什么。根据 CAP 理论&#…

代码随想录算法训练营第五十八天|739. 每日温度、496.下一个更大元素I

代码随想录 (programmercarl.com) 739. 每日温度 栈里面存放的是元素的下标&#xff0c;确保栈里面的下标对应的元素是单调递增的。 如果栈里面存放的是元素的话&#xff0c;就没有办法定位到下标值&#xff0c;无法计算出距离&#xff0c;所以直接就存入下标。 class Solut…

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…

【JAVA】深入了解 Java 中的 DelayQueue

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 Java中的DelayQueue是一个强大的工具&#xff0c;常用于处理需要延迟执行的任务或具有过期时间的元素。通过实现Delayed接口&#x…

​三子棋(c语言)

前言&#xff1a; 三子棋是一种民间传统游戏&#xff0c;又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏规则是双方对战&#xff0c;双方依次在9宫格棋盘上摆放棋子&#xff0c;率先将自己的三个棋子走成一条线就视为胜利。但因棋盘太小&#xff0c;三子棋在很多时候会出现和…

HCIP-端口隔离、arp代理、聚合vlan、QinQ

目录 一&#xff0c;端口隔离&#xff08;同vlan间同交换机下的端口隔离技术&#xff09; 端口隔离原理&#xff1a; 双向隔离配置 4&#xff0c;端口隔离特殊使用&#xff1a;单向隔离 6&#xff0c;ARP代理 6.1 路由式代理 6.2 VLAN内ARP代理 6.3 VLAN间ARP代理 6.3…

js逆向第8例:猿人学第1题-js 混淆-源码乱码

题目1:抓取所有(5页)机票的价格,并计算所有机票价格的平均值,填入答案。 老规矩打开控制台调试,出现debugger 过掉这个很简单了,右键点击“一律不在此处暂停” 这样就可以查看具体的网络请求如下: m是加密值,熟悉的大佬能发现这串加密字符非常像md5,|后面的就是时…