IEnumerator 枚举器的使用

本文详细介绍了C#中的IEnumerator枚举器概念,包括Current属性、MoveNext()、Reset()和Dispose()方法。同时,通过列举多个实战案例,如不同版本源码分析、时间操作和文件读取,深入理解枚举器的使用方法和应用场景。文章适用于熟悉C#的开发者,旨在提升对IEnumerator接口的理解和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、IEnumerator 概念

二、IEnumerator 案例

1、IEnumerator C#1 最早版本源码

2、IEnumerator C#2版本源码

3、IEnumerator 时间案例 -- 实战

4、IEnumerator 文件读取案例 -- 实战


涉及知识点:  IEnumerator 、 IEnumerable

一、IEnumerator 概念

IEnumerator 枚举器: 在枚举器中实现,下标自增,数据提取
                                    属性Current        -- 当前下标位置
                                    方法:MoveNext() -- 移动到下一个
                                                Reset()         -- 复位
                                                Dispose()    -- 释放迭代

IEnumerable 枚举器接口: 只要一个类型实现了IEnumerable接口,就可以对他进行foreach
                                     方法:GetEnumerator() -- 返回循环访问集合的枚举数

二、IEnumerator 案例

1、IEnumerator C#1 最早版本源码

代码编写:

    internal class Program
    {
        static void Main(string[] args)
        {
            string[] number = { "23", "23", "245" };
            StudentIEnumerable Tom = new StudentIEnumerable(number);

            foreach (object? item in Tom)
            {
                Console.WriteLine(item);
            }
            //返回值:  23
            //        23
            //        245
            Console.WriteLine("Hello World!");
        }
    }
    //枚举接口
    public class StudentIEnumerable : IEnumerable
    {
        object[] _objValue;
        public StudentIEnumerable(object[] objValue)
        {
            this._objValue = objValue;
        }

        public IEnumerator GetEnumerator()
        {
            return new StudentIEnumerator(_objValue);
        }
    }
    //枚举器
    public class StudentIEnumerator : IEnumerator
    {
        object[] _objValue { get; }
        int _position = -1;

        public StudentIEnumerator(object[] objValue)
        {
            _objValue = objValue;
        }
        //当前值
        public object Current
        {
            get
            {
                if (_position == -1 || _position == _objValue.Length)
                {
                    return false;
                }
                return _objValue[_position];
            }
        }
        //索引向下移一个
        public bool MoveNext()
        {
            if (_position++ < _objValue.Length - 1)
            {
                return true;
            }
            return false;
        }
        //复位
        public void Reset()
        {
            _position = -1;
        }
    }

结果显示:

2、IEnumerator C#2版本源码

建议:复制,自己跑一遍

代码编写:

    class Program
    {
        static readonly string Padding = "abcd";

        static IEnumerable<int> CreateEnumerable()
        {
            Console.WriteLine("---CreateEnumerable()方法开始---");
            for (int i = 0; i < 3; i++)
            {
                Console.WriteLine($"{i}--开始 yield ");
                Console.WriteLine($"******{Padding[i]}******");
                yield return i;
                Console.WriteLine($"{i}--结束 yield ");
            }
            yield return -1;
            Console.WriteLine("--- CreateEnumerable()方法结束---");
        }

        static void Main(string[] args)
        {
            IEnumerable<int> iterable = CreateEnumerable();
            IEnumerator<int> iterator = iterable.GetEnumerator();
            Console.WriteLine("-------------迭代开始---------");
            while (true)
            {
                Console.WriteLine("---调用MoveNext()方法");
                bool result = iterator.MoveNext();
                Console.WriteLine($"MoveNext方法返回值:{result}");
                if (!result)
                {
                    break;
                }
                Console.WriteLine($"当前指针位置:{iterator.Current}");
                Console.WriteLine();
            }
            Console.WriteLine("-------------迭代结束---------");
        }
    }

结果显示:

3、IEnumerator 时间案例 -- 实战

代码编写:

    class Program
    {
        static IEnumerable<DateTime> DataRange(DateTime dataTimeEnd)
        {
            for (DateTime i = DateTime.Now; i < dataTimeEnd; i = i.AddDays(1))
            {
                yield return i;
            }
        }

        static void Main(string[] args)
        {
            DateTime dateTimeEnd = DateTime.Now.AddDays(5);
            foreach (DateTime item in DataRange(dateTimeEnd))
            {
                Console.WriteLine(item.ToString());
            }
        }
    }

结果显示:

4、IEnumerator 文件读取案例 -- 实战

前期准备:

代码编写:

    class Program
    {
        static void Main(string[] args)
        {
            string fileName = "C:\\Users\\Rush\\Desktop\\C#\\linq查询\\123.txt";
            foreach (string line in ReadLines(fileName))
            {
                Console.WriteLine(line);
            }
        }

        static IEnumerable<string> ReadLines(string fileName)
        {
            string line;
            using (TextReader reader = File.OpenText(fileName))
            {
                while ((line = reader.ReadLine()) != null)
                {
                    yield return line;
                }
            }
        }
    }

结果显示:


如有错误,烦请批评指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值