目录
????????支持对非泛型集合的简单迭代。
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 ,则必须创建新的枚举器实例以返回到集合的第一个元素。
????????如果对集合进行了更改,例如添加、修改或删除元素,则枚举器的行为是不确定的。
// 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
*/
????????获取集合中位于枚举数当前位置的元素。
public object Current { get; }
属性值
Object
集合中位于枚举数当前位置的元素。
// 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("字符串不得为空", "提示");
}
}
}
}
????????将枚举数推进到集合的下一个元素。
public bool MoveNext ();
返回
Boolean
如果枚举数已成功地推进到下一个元素,则为 true;如果枚举数传递到集合的末尾,则为 false。
例外
InvalidOperationException
集合在枚举器创建后被修改。
?????????将枚举数设置为其初始位置,该位置位于集合中第一个元素之前。
public void Reset ();
例外
InvalidOperationException
集合在枚举器创建后被修改。