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];
        }
    }
}