C#神奇的yield关键字

先了解yield关键字:

    yield 关键字微软官方又称上下文关键字,是向编译器指示它所在的方法是迭代器块。编译器生成一个类来实现迭代器块中表示的行为。在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值。这是一个返回值,例如,在 foreach 语句的每一次循环中返回的值。yield 关键字也可与 break 结合使用,表示迭代结束。.

语法:

yield return <expression>;//返回到IEnumerable的数据yield break;

先来看一段代码:

    static IEnumerable<int> Numbers(int n)        {            int current = 1, next = 1;            for (int i = 0; i < n; ++i)            {                yield return current;                //下面记住上一结果和下一个结果的计算。                next = current + (current = next);            }        }        static void Main(string[] args)        {            //调用            foreach (var item in Numbers(10))//居然返回IEnumerable            {                Console.WriteLine(item.ToString());            }            Console.ReadLine();       }    //输出结果:1,1,2,5,8,13,21,34,55

      这段代码是计算斐波那契数列的算法,循环体仅仅用了四行代码,即可实现,居然可以这样实现,是不是很神奇。yield可以大大减少迭代器代码,让代码写起来更加轻松。之前通常计算斐波那契数列用递归和纯循环来完成。

        如果想在中途不执行,比如当等于34时就返回,如下。​​​​​​​

           for (int i = 0; i < n; ++i)            {                yield return current;                if (current == 34)                    yield break;                //下面记住上一结果和下一个结果的计算。                next = current + (current = next);            }

    当然不是所有情况都适合使用,比如在 try-catch 块中就不适用,详细说明请浏览微软官网:https://docs.microsoft.com/

结语

    斐波那契数列的算法是面试常考的算法题之一,小编都遇到几次了,如果在面试的过程中用yield关键字来低代码量实现,那么一定是加分项。对于yield 关键字你如果有啥看法,可以留言讨论。