IEnumerable 、 IEnumerator,yield return

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自定义迭代类

》》》using System.Collections;
在这里插入图片描述

using System.Collections;
using System.Runtime.CompilerServices;

namespace ConsoleApp1
{

    // 可迭代对象 标记此类可迭代 继承IEnumerable  类是可以迭代
    public class SpecificEnumerable : IEnumerable
    {
        private readonly object[] _dataSource;
        public SpecificEnumerable(object[] values)
        {
            _dataSource = values;
        }
        public IEnumerator GetEnumerator()
        {
            return new SpecificEnumerator(_dataSource);
        }
        // 迭代器 工作引擎
        internal class SpecificEnumerator : IEnumerator
        {
            private int _position; // 指针
            private readonly object[] _data; // 数据源
            public SpecificEnumerator(object[] data)
            {
                _position = -1;
                _data = data;
            }
            public bool MoveNext()
            {
                if (_position != _data.Length)
                {
                    _position++;
                }
                return _position >= 0 && _position < _data.Length;
            }
            public void Reset()
            {
                _position = -1;
            }
            public object Current
            {
                get
                {
                    if (_position == -1 || _position == _data.Length)
                    {
                        throw new IndexOutOfRangeException();
                    }
                    return _data[_position];
                }
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            #region 自定义可枚举类
            var myEnumerable = new SpecificEnumerable(new object[]
            {
            "A", "B", "C", "D"
            });
            foreach (var item in myEnumerable)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine("=========================>");
            var myEnumerator = myEnumerable.GetEnumerator();
            while (myEnumerator.MoveNext())
            {
                Console.WriteLine(myEnumerator.Current);
            }
            #endregion
        }
    }



}

用yield return

在这里插入图片描述

using System.Collections;
using System.Runtime.CompilerServices;

namespace ConsoleApp1
{

    public class SpecificYieldEnumerable : IEnumerable
    {
        private readonly Random _random = new();
        private readonly int _capacity;
        public SpecificYieldEnumerable(int count)
        {
            _capacity = count;
        }
        public IEnumerator GetEnumerator()
        {
            for (var i = 0; i < _capacity; i++)
            {
                yield return _random.Next(100);
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var myEnumerable = new SpecificYieldEnumerable(10);
            foreach (var item in myEnumerable)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine("=================>");
            var myEnumerator = myEnumerable.GetEnumerator();
            while (myEnumerator.MoveNext())
            {
                Console.WriteLine(myEnumerator.Current);
            }
        }
    }


}

针对整个集合中的每一个元素执行操作,那么程序的效率会很低。
把通用的IEnumerable或针对某种类型的IEnumerable设计成方法的输入及输出参数是一种比较少见的思路,因此,很多开发者都不会这样去做,但是这种思路确实能带来很多好处。
迭代器方法会等调用方真正用到某个元素时才去执行相应的代码,与传统的命令式方法相比,这种延迟执行(deferred execution,机制可以降低算法所需的存储空间,并使算法的各个部分之间能够更为灵活地拼接起来

迭代器方法真正强大之处在于它可以把多个步骤拼接成一整套流程。
如果能把复杂的算法拆解成多个步骤,并把每个步骤都表示成这种小型的迭代器方法,
那么就可以将这些方法拼成一条管道,使得程序只需把源序列处理一遍即可对其中的元素执行许多种小的变换。
就好比 循环计算 ,每次都计算结果,在把结果跟下一个数进行计算。
int result=0;
for(int i=1;i<100;i++)
{
result +=i;
}
迭代器 是 1+2+3.。。。。99 一起计算的。 效率比较高

// 为了演示迭代器方法的好处,笔者先举一个简单的例子,然后用迭代器方法改写。 
public static void Unique(IEnumerable<int> nums)
{
    var uniqueVals = new HashSet<int>(); 

    foreach(var num in nums)
    {
        if(!uniqueVals.Contains(num))
        {
            uniqueVals.Add(num);
            Console.WriteLine(num); 
        }
    }
}

// 为此,可以考虑改用迭代器方法来实现:
public static IEnumerable<int> UniqueV2(IEnumerable<int> nums)
{
    var uniqueVals = new HashSet<int>();
    foreach (var num in nums)
    {
        if (!uniqueVals.Contains(num))
        {
            uniqueVals.Add(num);
            yield return num; 
        }
    }
}

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

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

相关文章

首搭第五代DM技术,秦L DM-i正式上市,仅售9.98万元起

5月28日&#xff0c;比亚迪王朝重磅新车秦L DM-i在西安震撼上市&#xff0c;首搭第五代DM技术&#xff0c;百公里亏电油耗达到划时代的2.9L&#xff0c;“一箱油”满油满电综合续航达2100公里&#xff0c;引领中级&#xff0c;创下了百公里油耗的历史新低&#xff0c;开创油耗2…

第一讲:单片机STC89C52+RA8889驱动控制彩屏(源码公开)

51单片机驱动控制彩屏系列讲座 第一讲&#xff1a;单片机STC89C52RA8889驱动控制彩屏&#xff08;源码公开&#xff09; 单片机通过SPI与RA8889进行通信&#xff0c;由于单片机是5V&#xff0c;RA8889是3.3V,故需要进行电平转换&#xff0c;有现成的模组TXS0108E等可以采用。…

vue+element-ui时间级联动态表单,新增行,删除行,表单验证

需求背景: 需要实现配置一种时间去执行定时任务,可能是每年一次,每月一次,每周一次,每天一次四种情况,最少配置一条,最多配置五条。年,月,周,日,时分秒是级联关系。点击提交,整体表单校验。 效果图 代码实现,具体看里面的注释 完整代码 <template><e…

如何实现数据的正确拆分?

我们知道在传统的单块架构中&#xff0c;一个系统中只存在一个独立的服务和数据库实例。 上图中的系统架构实现起来比较简单&#xff0c;但是扩展性和伸缩性都比较差。因此&#xff0c;越来越多的系统开始采用了微服务架构。在微服务架构中&#xff0c;一个系统被拆分成多个服务…

数据大屏方案 : 实现数据可视化的关键一环_光点科技

在数字时代的浪潮中&#xff0c;数据已经成为企业决策和操作的重要基础。因此&#xff0c;“数据大屏方案”逐渐成为业界关注的焦点。这类方案通过将复杂的数据集合以直观的形式展现出来&#xff0c;帮助决策者快速把握信息&#xff0c;做出更加明智的决策。 数据大屏的定义及作…

基于异构图的大规模微服务系统性能问题诊断

简介&#xff1a;本文介绍由南开大学、清华大学、腾讯、国家超级计算天津中心共同合作的论文&#xff1a;基于异构图的大规模微服务系统性能问题诊断。该论文已被IEEE Transactions on Services Computing期刊录用 论文标题&#xff1a;Diagnosing Performance Issues for Lar…

有限元之抛物型方程初边值问题解法

目录 一、原方程的变分形式 二、有限元法进行空间半离散 三、差分法进行时间全离散 四、相关量的数值计算 五、编程时的说明 六、算例实现 6.1 C代码 6.2 计算结果 本节我们将采用有限元法联合差分法来数值求解抛物型方程的初边值问题&#xff1a; 其中常数。 一、原方…

达梦数据库安装手册

首先了解达梦数据库相关内容&#xff1a; 达梦在线服务平台 下载windows版本开发版&#xff0c;将下载的文件解压。进行安装 2、安装流程&#xff0c;默认选择下一步。 3、安装引导&#xff0c;默认下一步&#xff0c;安装实例可以进行修改 4、最后一步记录一下创建的摘要 …

六西格玛项目课题决策权归属:谁来做主更明智?

在实施六西格玛的过程中&#xff0c;一个关键的问题摆在了我们面前&#xff1a;应该由谁决定六西格玛的项目课题&#xff1f;这个问题不仅关系到项目能否顺利实施&#xff0c;更直接影响到企业整体绩效的提升。深圳天行健企业管理咨询公司解析如下&#xff1a; 首先&#xff0…

基于Java实现的图书管理系统

前言&#xff1a;该图书管理系统实现了查找、添加、删除、显示、借阅、归还等功能&#xff0c;分为两个用户群体&#xff1a;管理者和普通用户。使用了类与对象&#xff0c;封装继承多态&#xff0c;抽象类和接口等Java基础知识。 一.思路 面向对象三部曲&#xff1a;找对象&…

JavaDS-学习数据结构之如果从零开始手搓顺序表,顺带学习自定义异常怎么用!

前言 笔者开始学习数据结构了,虽然笔者已经会用了,不管是C 中的stl亦或是Java 中的集合,为了算法比赛多少都突击过,但只知其然而不知其所以然,还是会限制发展的,因此,笔者写下这篇博客.内容是手搓一个顺序表.顺带加一点异常的使用,大伙看个乐子就好了.有错误直接私信喷我就好了…

【AI赋能】香橙派OrangePi AIpro初体验

【AI赋能】香橙派OrangePi AIpro初体验 1、初识香橙派1.1、仪式感开箱1.2、OrangePi AIpro(8T)介绍 2、上电开机2.1、开机2.2、串口调试2.2.1 两种方式登录2.2.2 相关信息 2.3、启动系统2.4、网络配置 3、连接摄像头4、目标检测4.1、Jupyter Lab模式4.2、 目标检测测试4.2.1 视…

花钱学谢宁DOE培训,投入产出比到底如何?

在当今这个快速发展的时代&#xff0c;无论是职场人士还是创业者&#xff0c;都渴望通过不断学习来提升自我能力&#xff0c;以便在竞争激烈的市场中脱颖而出。其中&#xff0c;谢宁DOE培训因其独特的理念和方法&#xff0c;吸引了众多求学者的目光。然而&#xff0c;面对不菲的…

多条文本转二维码怎么做?一键批量建码的使用技巧

怎么快速的制作多条文本信息的二维码&#xff1f;随着二维码的广泛使用&#xff0c;现在很多内容都可以通过生成二维码扫码的方式来获取信息&#xff0c;其他文本二维码就是比较常用的一种类型。那么当需要将多条不同的文本内容每条单独生成二维码时&#xff0c;有什么方法可以…

如何借VR之手,让展厅互动更精彩?

VR虚拟现实技术以其卓越的沉浸式体验为特点&#xff0c;引领用户踏入一个全新的虚拟世界&#xff0c;正因如此&#xff0c;它开始被广泛应用于展厅、商业等多个领域。那么&#xff0c;今天&#xff0c;让我们就来了解一下这种技术是如何为展厅带来精彩互动体验的吧&#xff01;…

Hudi之数据读写探究

Hudi之数据读写深入探究 1. Hudi数据写入 1-1. 写操作 Hudi数据湖中的数据更新、插入和删除操作&#xff0c;是一个基于Apache Hadoop的库&#xff0c;为数据湖提供了一种有效的方法来处理更新和增量数据&#xff0c;并支持基于时间的快照和增量数据处理。Hudi支持三种主要的…

可道云网盘的URL链接能干什么?小白必看的teamOS使用技巧

在繁复的工作日常里&#xff0c;我们每天都在与各种文件和资料打交道。由于文件夹太多&#xff0c;常常会陷入那种死活找不到想要的文件的困境中。 比如询问同事&#xff0c;合同模板在哪&#xff0c;直接发微信当然是很快的&#xff0c;但是事后想归档总是格外麻烦。比如&…

英飞凌24GHz毫米波雷达-BGT24LTR11N16家用机器人应用

BGT24LTR11N16基础描述&#xff1a; 关于BGT24LTR11N16&#xff0c;它是一款用于信号生成和接收的硅锗雷达MMlC&#xff0c;工作频率为24.00GHz至24.25GHz ISM频段。它基于24GHz基本电压控制振荡器&#xff08;VCO&#xff09;。 这颗芯片是属于1T1R&#xff0c;也就是一发一收…

10年老运营人吐血整理,给新媒体运营人的20条建议!沈阳新媒体运营培训

对于企业&#xff0c;在新媒体平台开设官方账号应该是已经成为标配。不仅是对企业新媒体运营需求量提高&#xff0c;新媒体人的薪资也是水涨船高。 另外值得注意的是&#xff0c;企业对资深新媒体运营人才尤为重视&#xff0c;这表现在他们不惜重金招聘高薪新媒体运营人才&…

Android Studio中xml预览不显示问题解决办法

具体表现&#xff1a; Android Studio的XML中可以看到视图的相对位置结构&#xff0c;但是看不到具体的模样&#xff0c;全黑&#xff0c;等于半摸黑调UI&#xff08;由于我已经修好了所以没有截图&#xff09;。不是所有的项目都会这样&#xff0c;一部分项目是正常的。 或许…