C#基础学习--枚举器和迭代器

枚举器和可枚举类型

数组按需提供一个叫做枚举器的对象。枚举器可以依次返回请求数组中的元素。

调用对象的GetEnumerator 方法可以获取一个对象枚举器,可以知道枚举器的类型。实现GetEnumerator方法的类型叫做 可枚举类型。数组是可枚举数组

C#基础学习--枚举器和迭代器_第1张图片

foreach 结构设计用来和可枚举类型一起使用。只要它遍历的对象是可枚举类型,就可以执行如下操作:

C#基础学习--枚举器和迭代器_第2张图片

 IEnumerator 接口

实现了 IEnumerator 接口的枚举器包含3个函数成员:Current ,MoveNext, Reset

C#基础学习--枚举器和迭代器_第3张图片

枚举器与序列中的当前项保持联系的方式完全取决于实现,可以通过对象引用,索引值或其他方式来实现

C#基础学习--枚举器和迭代器_第4张图片

C#基础学习--枚举器和迭代器_第5张图片

C#基础学习--枚举器和迭代器_第6张图片

IEnumerable 接口

可枚举类型是指实现了 IEnumerable 接口的类。IEnumerable 接口只有一个成员---GetEnumerator方法,它返回对象的枚举器

C#基础学习--枚举器和迭代器_第7张图片

实现 IEnumerable 和 IEnumerator的示例

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

namespace Csharpzuoye
{
    
    class ColorEnumerator : IEnumerator
    {
        string[] _colors;
        int _position = -1;

        public ColorEnumerator(string[] theColors)  //构造函数
        {
            _colors = new string[theColors.Length];
            for (int i = 0; i < theColors.Length; i++)
                _colors[i] = theColors[i];
        }

        public object Current  //实现Current
        {
            get
            {
                if (_position == -1)
                    throw new InvalidOperationException();
                if (_position >= _colors.Length)
                    throw new InvalidOperationException();

                return _colors[_position];
            }
        }

        public bool MoveNext()  //实现MoveNext
        {
            if(_position < _colors.Length - 1)
            {
                _position++;
                return true;
            }
            else
            {
                return false;
            }
        }

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

    class Spectrum : IEnumerable
    {
        string[] Colors = { "violet", "blue", "cyan", "green", "yellow", "orange", "red" };

        public IEnumerator GetEnumerator()
        {
            return new ColorEnumerator(Colors);
        }
    }

    class Program
    {
        static void Main()
        {
            Spectrum spectrum = new Spectrum();
            foreach (string color in spectrum)
                Console.WriteLine(color);
        }
    }
}

 泛型枚举接口

你可能感兴趣的:(C#,C#)