C#迭代器是一种用于依次返回集合元素的特殊方法,它可以让自定义的集合类型支持foreach遍历,不需要手动实现复杂的枚举器逻辑。迭代器的核心是通过yield return语句逐个返回元素,编译器会自动生成对应的枚举器类,简化开发流程。

C#迭代器的基本原理
在C#中,迭代器通常返回IEnumerable或者IEnumerator类型的对象。当方法中包含yield return语句时,这个方法就成为了迭代器方法,调用该方法不会立即执行方法体,而是返回一个可枚举的对象,只有在遍历这个对象时,方法体才会逐步执行。
迭代器的执行逻辑是这样的:第一次调用MoveNext方法时,会执行迭代器方法直到遇到第一个yield return,返回当前的值,同时保存当前的执行位置;后续调用MoveNext时,会从之前保存的位置继续执行,直到遇到下一个yield return或者方法结束。
自定义集合的迭代器实例
下面我们创建一个自定义的学生集合类,通过迭代器实现支持foreach遍历的功能,完整源码如下:
using System;
using System.Collections;
using System.Collections.Generic;
// 自定义学生类
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
// 自定义学生集合类,实现IEnumerable接口以支持遍历
public class StudentCollection : IEnumerable
{
private List<Student> _students = new List<Student>();
// 添加学生的方法
public void AddStudent(Student student)
{
_students.Add(student);
}
// 实现IEnumerable接口的GetEnumerator方法,这里使用迭代器实现
public IEnumerator GetEnumerator()
{
// 遍历内部的学生列表,逐个返回元素
for (int i = 0; i < _students.Count; i++)
{
yield return _students[i];
}
}
// 还可以实现一个带过滤条件的迭代器方法
public IEnumerable<Student> GetAdults()
{
foreach (var student in _students)
{
if (student.Age >= 18)
{
yield return student;
}
}
}
}
class Program
{
static void Main(string[] args)
{
// 初始化学生集合
StudentCollection students = new StudentCollection();
students.AddStudent(new Student { Id = 1, Name = "张三", Age = 16 });
students.AddStudent(new Student { Id = 2, Name = "李四", Age = 20 });
students.AddStudent(new Student { Id = 3, Name = "王五", Age = 19 });
Console.WriteLine("遍历所有学生:");
// 直接使用foreach遍历自定义集合
foreach (Student stu in students)
{
Console.WriteLine($"学号:{stu.Id},姓名:{stu.Name},年龄:{stu.Age}");
}
Console.WriteLine("n遍历成年学生:");
// 调用带过滤条件的迭代器方法
foreach (Student stu in students.GetAdults())
{
Console.WriteLine($"学号:{stu.Id},姓名:{stu.Name},年龄:{stu.Age}");
}
}
}
代码解析
上面的实例中,StudentCollection类实现了IEnumerable接口,所以必须实现GetEnumerator方法。我们没有手动创建实现IEnumerator的类,而是直接在GetEnumerator方法中使用yield return返回每个学生对象,编译器会自动生成对应的枚举器逻辑。
另外我们还定义了一个GetAdults的迭代器方法,返回类型是IEnumerable<Student>,这个方法会过滤出年龄大于等于18的学生,同样通过yield return逐个返回符合条件的元素。
迭代器的注意事项
- 迭代器方法中不能包含return语句,只能使用yield return返回元素,使用yield break结束迭代。
- yield return后面的表达式类型需要和迭代器返回的集合元素类型兼容。
- 迭代器方法返回的可枚举对象,每次遍历都会重新执行迭代器方法的逻辑,不会缓存之前的结果。
- 如果需要在迭代器中处理异常,需要注意异常抛出的时机,只有在遍历时才会触发迭代器方法中的异常。
常见应用场景
迭代器除了用于自定义集合遍历,还可以用于以下场景:
- 读取大文件时,逐行返回内容,避免一次性将整个文件加载到内存中。
- 处理数据库分页查询时,逐页返回查询结果,减少内存占用。
- 生成无限序列,比如自然数序列,只有在需要时才会生成对应的元素。
C#迭代器IEnumerableGetEnumeratoryield_return修改时间:2026-07-01 04:15:37