前言
上篇文章我们了解了IEnumerable和IEnumeratorC#学习笔记–由浅至深理解IEnumerable和IEnumerator
这篇文章我们来研究foreach循环
foreach原理
foreach循环实际上是通过调用集合的GetEnumerator方法来获取一个枚举器,然后在每次迭代中调用枚举器的MoveNext方法来遍历集合的。当枚举器的MoveNext方法返回false时,表示集合中没有更多元素,循环结束。
也就是说,只要是实现了 IEnumerable 接口,都可以被 foreach 循环遍历。
实现自己的容器
那有了这个理论基础,我们赶紧来自己写一个小容器吧
例子一:数组容器
- 先定义一个类,实现IEnumerable接口
public class MyNumbers : IEnumerable<int>
{
private int[] numbers = new int[] { 1, 2, 3 };
public IEnumerator<int> GetEnumerator()
{
return null;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
- 定义该类的迭代器
public class MyNumbers : IEnumerable<int>
{
private int[] numbers = new int[] { 1, 2, 3 };
public IEnumerator<int> GetEnumerator()
{
return new MyEnumerator(numbers);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public class MyEnumerator : IEnumerator<int>
{
private int[] numbers;
private int index = -1;
public MyEnumerator(int[] numbers)
{
this.numbers = numbers;
}
public int Current
{
get
{
return numbers[index];
}
}
object IEnumerator.Current
{
get
{
return Current;
}
}
public bool MoveNext()
{
index++;
return index < numbers.Length;
}
public void Reset()
{
index = -1;
}
public void Dispose()
{
// No resources to dispose
}
}
在这个例子中,我们创建了两个类:MyNumbers和MyEnumerator。
MyNumbers类实现了IEnumerable< int >接口,它定义了一个GetEnumerator方法,该方法返回一个实现了IEnumerator< int >接口的对象。
而MyEnumerator类实现了IEnumerator< int >接口,它定义了用于遍历序列的方法,例如MoveNext和Current。
我们可以使用下面的代码来遍历这个自定义的迭代器类:
MyNumbers myNumbers = new MyNumbers();
foreach (int number in myNumbers)
{
Console.WriteLine(number);
}
例子二:Student类
- 先定义一个Student类,实现IEnumerable接口
public class Student : IEnumerable
{
private int id;
private int age;
private string name;
public Student(int id_in, int age_in, string name_in)
{
id = id_in;
age = age_in;
name = name_in;
}
public IEnumerator GetEnumerator()
{
return null;
}
}
- 定义该类的迭代器
public class Student : IEnumerable
{
private int id;
private int age;
private string name;
public Student(int id_in, int age_in, string name_in)
{
id = id_in;
age = age_in;
name = name_in;
}
public IEnumerator GetEnumerator()
{
return new StudentEnumerator(this);
}
private class StudentEnumerator : IEnumerator
{
private Student student;
private int index = -1;
public StudentEnumerator(Student student)
{
this.student = student;
}
public object Current
{
get
{
switch (index)
{
case 0:
return student.id;
case 1:
return student.age;
case 2:
return student.name;
default:
throw new InvalidOperationException();
}
}
}
public bool MoveNext()
{
index++;
return index < 3;
}
public void Reset()
{
index = -1;
}
}
}
在这个例子中,我们创建了两个类:Student 和 StudentEnumerator。
Student 类实现了 IEnumerable 接口,它定义了一个返回 IEnumerator 对象的 GetEnumerator 方法。
而 StudentEnumerator 类实现了 IEnumerator 接口,它定义了用于遍历序列的方法,例如 MoveNext 和 Current。文章来源:https://www.toymoban.com/news/detail-438174.html
现在,我们可以使用 foreach 循环来遍历 Student 类的实例了。例如:文章来源地址https://www.toymoban.com/news/detail-438174.html
Student student = new Student(1, 18, "Alice");
foreach (var item in student)
{
Console.WriteLine(item);
}
到了这里,关于C#学习笔记--foreach循环是怎么遍历容器的?实战带你弄懂foreach原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!