一.介绍
C# 中的迭代器是一项强大的功能,可让您遍历数组、列表或任何自定义集合类型等集合。它们提供了一种优雅的方式来按顺序访问元素,而无需暴露集合的底层表示。本文探讨了迭代器的概念、它们的实现以及 C# 中的实际用例。
二.什么是迭代器?
迭代器是一种特殊对象,它便于一次遍历集合中的一个元素。在 C# 中,迭代器是使用方法、属性或访问器中的 Yield 关键字实现的。调用迭代器时,它不会立即执行其代码。相反,它会返回一个枚举器,让您可以遍历集合。
三.在 C# 中实现迭代器
1.使用yield return
Yield return 语句提供了一种实现迭代器的简单方法。它允许您一次返回一个元素。
这是一个使用yield return实现的迭代器的基本示例。
using System;
using System.Collections.Generic;
public class NumberCollection
{
private int[] numbers = { 1, 2, 3, 4, 5 };
public IEnumerator<int> GetEnumerator()
{
foreach (int number in numbers)
{
yield return number;
}
}
}
public class Program
{
public static void Main()
{
NumberCollection collection = new NumberCollection();
foreach (int number in collection)
{
Console.WriteLine(number);
}
}
}
2.使用yield break
Yield break 语句用于提前结束迭代。当满足某些条件且不需要进一步迭代时,该语句很有用。
using System;
using System.Collections.Generic;
public class EvenNumberCollection
{
private int[] numbers = { 1, 2, 3, 4, 5, 6 };
public IEnumerator<int> GetEnumerator()
{
foreach (int number in numbers)
{
if (number % 2 != 0)
{
yield break;
}
yield return number;
}
}
}
public class Program
{
public static void Main()
{
EvenNumberCollection collection = new EvenNumberCollection();
foreach (int number in collection)
{
Console.WriteLine(number);
}
}
}
3.自定义迭代器
还可以为自定义集合类型实现迭代器。当您需要明确控制迭代逻辑时,这很有用。
using System;
using System.Collections;
using System.Collections.Generic;
public class CustomCollection<T> : IEnumerable<T>
{
private T[] items;
public CustomCollection(T[] items)
{
this.items = items;
}
public IEnumerator<T> GetEnumerator()
{
for (int i = 0; i < items.Length; i++)
{
yield return items[i];
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public class Program
{
public static void Main()
{
CustomCollection<string> collection = new CustomCollection<string>(
new string[] { "Hello", "World", "C#", "Iterators" });
foreach (string item in collection)
{
Console.WriteLine(item);
}
}
}
四.使用迭代器的优点
- 简单性:迭代器简化了遍历集合所需的代码。
- 惰性求值:迭代器仅在需要时提供元素,从而避免不必要的计算或内存分配来提高性能。
- 抽象:它们提供了一种访问元素的方法,而无需暴露集合的底层结构。
五.结论
迭代器是 C# 的一个基本组成部分,它提供了一种方便的方法来遍历集合。通过使用 Yield Return 和 Yield Break 语句,您可以创建强大而灵活的迭代机制。无论您使用的是内置集合还是自定义类型,理解和利用迭代器都可以大大提高您编写简洁高效代码的能力。