前言
上篇文章我們了解了IEnumerable和IEnumeratorC#學習筆記–由淺至深理解IEnumerable和IEnumerator
這篇文章我們來研究foreach循環(huán)
foreach原理
foreach循環(huán)實際上是通過調用集合的GetEnumerator方法來獲取一個枚舉器,然后在每次迭代中調用枚舉器的MoveNext方法來遍歷集合的。當枚舉器的MoveNext方法返回false時,表示集合中沒有更多元素,循環(huán)結束。
也就是說,只要是實現了 IEnumerable 接口,都可以被 foreach 循環(huán)遍歷。
實現自己的容器
那有了這個理論基礎,我們趕緊來自己寫一個小容器吧
例子一:數組容器
- 先定義一個類,實現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
}
}
在這個例子中,我們創(chuàng)建了兩個類: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;
}
}
}
在這個例子中,我們創(chuàng)建了兩個類:Student 和 StudentEnumerator。
Student 類實現了 IEnumerable 接口,它定義了一個返回 IEnumerator 對象的 GetEnumerator 方法。
而 StudentEnumerator 類實現了 IEnumerator 接口,它定義了用于遍歷序列的方法,例如 MoveNext 和 Current。文章來源:http://www.zghlxwxcb.cn/news/detail-438174.html
現在,我們可以使用 foreach 循環(huán)來遍歷 Student 類的實例了。例如:文章來源地址http://www.zghlxwxcb.cn/news/detail-438174.html
Student student = new Student(1, 18, "Alice");
foreach (var item in student)
{
Console.WriteLine(item);
}
到了這里,關于C#學習筆記--foreach循環(huán)是怎么遍歷容器的?實戰(zhàn)帶你弄懂foreach原理的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!