C#迭代器
using System.Collections;
class Application
{
// 迭代器的进度是在何时重置的
// 迭代器不支持 IEnumerator.Reset 方法。 若要从头开始重新迭代,必须获取新的迭代器。
static IEnumerable Data()
{
for (int i = 0; i < 3; i++)
{
yield return i; // 有多次return
}
// yield return不同的数据类型,是可以通过编译的
// 但是在Runtime,不能正确执行类型转换的话,还是会报错
// yield return "0";
// 函数执行到最后,才是真正的结束
}
// 加上类型描述
static IEnumerable<int> DataInt()
{
yield return 0;
// 返回值加了类型描述之后,就不能这么写了
// yield return "0";
}
// 加上参数
static IEnumerable<int> DataIntRange(int l, int r)
{
for (int i = l; i <= r; i += 1)
{
yield return i * i;
}
}
static void Main()
{
// 使用for循环遍历数据
foreach (int i in Data())
{
Console.WriteLine(i.ToString());
}
Console.WriteLine();
foreach (int i in DataIntRange(1, 3))
{
Console.WriteLine(i.ToString());
}
Console.WriteLine();
// 获取迭代器,手动迭代
var Enumerator = DataIntRange(1, 5).GetEnumerator();
while (Enumerator.MoveNext())
{
Console.WriteLine(Enumerator.Current.ToString());
}
Console.WriteLine();
var Fruits = new Fruit();
foreach (string Name in Fruits)
{
Console.WriteLine(Name);
}
}
}
// 可以用作迭代数据的类
class Fruit : IEnumerable
{
private string[] Fruits = { "Apple", "Banana", "Cat?" };
// 这个函数必须实现
public IEnumerator GetEnumerator()
{
for (int i = 0; i < Fruits.Length; i++)
{
yield return Fruits[i];
}
}
}