C#中IEnumerator 接口及IEnumerator.Current属性、IEnumerator.MoveNext方法和IEnumerator.Reset方法

发布时间:2024年01月11日

目录

一、IEnumerator 接口

1.定义?

2.示例

二、IEnumerator.Current属性

1.定义

2.示例

三、IEnumerator.MoveNext方法

四、IEnumerator.Reset方法


一、IEnumerator 接口

????????支持对非泛型集合的简单迭代。

1.定义?

public interface IEnumerator

????????未显式调用IEnumerator 接口的IEnumerable的成员,使用 foreach循环访问集合。

????????IEnumerator 是所有非泛型枚举器的基接口。

????????枚举器可用于读取集合中的数据,但不能用于修改基础集合。

????????最初,枚举数定位在集合中第一个元素的前面。 在读取Current的值之前,必须调用 MoveNext 方法以将枚举数推进到集合的第一个元素,否则Current未定义。

????????在调用 Current 或 MoveNext 之前,Reset 返回同一对象。 MoveNext 将 Current 设置为下一个元素。

????????如果 MoveNext 传递集合的末尾,则枚举器位于集合中最后一个元素之后,并 MoveNext 返回 false。 当枚举器位于此位置时,对 MoveNext 的后续调用也会返回 false。 如果最后一次MoveNext调用返回 false,则Current为未定义。

????????若要再次设置为Current集合的第一个元素,可以调用 Reset、MoveNext。 如果未 Reset ,则必须创建新的枚举器实例以返回到集合的第一个元素。

????????如果对集合进行了更改,例如添加、修改或删除元素,则枚举器的行为是不确定的。

2.示例

// IEnumerator 接口
using System.Collections;

namespace ConsoleApp7
{
    public class Person(string fName, string lName)
    {
        public string firstName = fName;
        public string lastName = lName;
    }

    // Collection of Person objects. This class
    // implements IEnumerable so that it can be used
    // with ForEach syntax.
    public class People : IEnumerable
    {
        private readonly Person[] _people;
        public People(Person[] pArray)
        {
            _people = new Person[pArray.Length];

            for (int i = 0; i < pArray.Length; i++)
            {
                _people[i] = pArray[i];
            }
        }

        // Implementation for the GetEnumerator method.
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        public PeopleEnum GetEnumerator()
        {
            return new PeopleEnum(_people);
        }
    }

    // When you implement IEnumerable, you must also implement IEnumerator.
    public class PeopleEnum(Person[] list) : IEnumerator
    {
        public Person[] _people = list;

        // Enumerators are positioned before the first element
        // until the first MoveNext() call.
        int position = -1;

        public bool MoveNext()
        {
            position++;
            return position < _people.Length;
        }

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

        object IEnumerator.Current
        {
            get
            {
                return Current;
            }
        }

        public Person Current
        {
            get
            {
                try
                {
                    return _people[position];
                }
                catch (IndexOutOfRangeException)
                {
                    throw new InvalidOperationException();
                }
            }
        }
    }

    class App
    {
        static void Main()
        {
            Person[] peopleArray =
            [
            new Person("John", "Smith"),
            new Person("Jim", "Johnson"),
            new Person("Sue", "Rabon"),
            ];

            People peopleList = new(peopleArray);
            foreach (Person p in peopleList)
                Console.WriteLine(p.firstName + " " + p.lastName);
        }
    }
}

/* 运行结果:
John Smith
Jim Johnson
Sue Rabon

 */

二、IEnumerator.Current属性

????????获取集合中位于枚举数当前位置的元素。

1.定义

public object Current { get; }

属性值
Object
集合中位于枚举数当前位置的元素。

2.示例

// IEnumerator.MoveNext 方法
// IEnumerator.Current 属性
using System.Text;
using System.Collections;
namespace _042
{
    public partial class Form1 : Form
    {
        private GroupBox? groupBox1;
        private TextBox? textBox2;
        private TextBox? textBox1;
        private Button? button1;
        private Label? label1;

        public Form1()
        {
            InitializeComponent();
            Load += Form1_Load;
        }
        private void Form1_Load(object? sender, EventArgs e)
        {
            // 
            // textBox2
            // 
            textBox2 = new TextBox
            {
                Location = new Point(115, 58),
                Name = "textBox2",
                Size = new Size(179, 23),
                TabIndex = 3
            };
            // 
            // textBox1
            // 
            textBox1 = new TextBox
            {
                Location = new Point(115, 29),
                Name = "textBox1",
                Size = new Size(179, 23),
                TabIndex = 2
            };
            // 
            // button1
            // 
            button1 = new Button
            {
                Location = new Point(6, 58),
                Name = "button1",
                Size = new Size(75, 23),
                TabIndex = 1,
                Text = "删除空格",
                UseVisualStyleBackColor = true
            };
            button1.Click += Button1_Click;
            // 
            // label1
            // 
            label1 = new Label
            {
                AutoSize = true,
                Location = new Point(6, 35),
                Name = "label1",
                Size = new Size(80, 17),
                TabIndex = 0,
                Text = "输入字符串:"
            };
            // 
            // groupBox1
            // 
            groupBox1 = new GroupBox
            {
                Location = new Point(12, 12),
                Name = "groupBox1",
                Size = new Size(300, 87),
                TabIndex = 0,
                TabStop = false,
                Text = "删除空格"
            };
            groupBox1.Controls.Add(textBox2);
            groupBox1.Controls.Add(textBox1);
            groupBox1.Controls.Add(button1);
            groupBox1.Controls.Add(label1);
            groupBox1.SuspendLayout();
            
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(7F, 17F);
            AutoScaleMode = AutoScaleMode.Font;
            BackColor = SystemColors.ControlLight;
            ClientSize = new Size(324, 111);
            Controls.Add(groupBox1);
            Name = "Form1";
            StartPosition = FormStartPosition.CenterScreen;
            Text = "删除字符串中空格";           
            groupBox1.ResumeLayout(false);
            groupBox1.PerformLayout();
        }

        private void Button1_Click(object? sender, EventArgs e)
        {
            if (textBox1!.Text != "")
            {
                char[] chr = textBox1!.Text.ToCharArray();      //得到字符数组
                IEnumerator ienumerator_chr =                   //得到枚举器
                    chr.GetEnumerator();
                StringBuilder stringbuilder = new();            //创建stringbuilder对象
                while (ienumerator_chr.MoveNext())              //开始枚举
                {
                    stringbuilder.Append(                       //向stringbuilder对象中添加非空格字符
                        (char)ienumerator_chr.Current != ' ' ?  //精彩的三元语句
                        ienumerator_chr.Current.ToString() : string.Empty);
                }
                textBox2!.Text = stringbuilder.ToString();      //得到没有空格的字符串
            }
            else
            {
                MessageBox.Show("字符串不得为空", "提示");
            }            
        }
    }
}

三、IEnumerator.MoveNext方法

????????将枚举数推进到集合的下一个元素。

public bool MoveNext ();

返回
Boolean
如果枚举数已成功地推进到下一个元素,则为 true;如果枚举数传递到集合的末尾,则为 false。

例外
InvalidOperationException
集合在枚举器创建后被修改。

四、IEnumerator.Reset方法

?????????将枚举数设置为其初始位置,该位置位于集合中第一个元素之前。

public void Reset ();

例外
InvalidOperationException
集合在枚举器创建后被修改。

文章来源:https://blog.csdn.net/wenchm/article/details/135491067
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。