为什么我需要现实生活中的迭代器?没有内置的C#集合类型

时间:2018-05-04 09:03:50

标签: c# loops iterator

我有2个实现计算斐波纳契数的方法。为什么我需要在现实生活中实现迭代器,也不需要Fibonacci示例?因为我无法看到差异。是的,我知道接口,但我需要一个真正的例子,其中迭代器是有用的,而不仅仅是在内置集合类型中。如果我可以在Fibo方法中做到,我为什么需要Fibonacci迭代器方法?

using System;
using System.Collections.Generic;

class Fibonacci_C
{
    static void Main()
    {
        foreach (int fib in Fibo(5))
        {
            Console.WriteLine(fib);
        }

        Console.ReadLine();
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine(Fibonacci(i));
        }

        Console.ReadLine();
    }

    static public IEnumerable<int> Fibo(int length)
    {
        int prevFib = 0, curFib = 1, newFib = 0;
        for (int i = 0; i < length; i++)
        {
            yield return prevFib;
            newFib = prevFib + curFib;
            prevFib = curFib;
            curFib = newFib;
        }
    }

    public static int Fibonacci(int length)
    {
        int a = 0;
        int b = 1;
        for (int i = 0; i < length; i++)
        {
            int temp = a;
            a = b;
            b = temp + b;
        }

        return a;
    }
}

1 个答案:

答案 0 :(得分:4)

在您的示例中,迭代器可以避免您反复计算已经计算过的斐波纳契数。你的第二种方法

public static int Fibonacci(int length)
{
    int a = 0;
    int b = 1;
    for (int i = 0; i < length; i++)
    {
        int temp = a;
        a = b;
        b = temp + b;
    }
    return a;
}

for循环中调用时,必须在每次调用时计算所有斐波那契数字,最多为Fib(length),即使它已在之前的调用中计算过它们。你的迭代器方法会让你失望,因为它只计算一次斐波那契数,并使用yield return返回它。

但是,迭代器并不是避免不必要的重新计算的唯一方法。