IEnumerable是否必须使用Yield来延迟

Dav*_*eer 6 c#

IEnumerable是否必须使用Yield来延迟?

这是测试代码,它帮助我理解延迟执行和收益.

 //immediate execution
        public IEnumerable Power(int number, int howManyToShow)
        {
            var result = new int[howManyToShow];
            result[0] = number;
            for (int i = 1; i < howManyToShow; i++)
                result[i] = result[i - 1] * number;
            return result;
        }

        //deferred but eager
        public IEnumerable PowerYieldEager(int number, int howManyToShow)
        {
            var result = new int[howManyToShow];
            result[0] = number;
            for (int i = 1; i < howManyToShow; i++)
                result[i] = result[i - 1] * number;

            foreach (var value in result)
                yield return value;
        }

        //deferred and lazy
        public IEnumerable PowerYieldLazy(int number, int howManyToShow)
        {
            int counter = 0;
            int result = 1;
            while (counter++ < howManyToShow)
            {
                result = result * number;
                yield return result;
            }
        }

        [Test]
        public void Power_WhenPass2AndWant8Numbers_ReturnAnEnumerable()
        {
            IEnumerable listOfInts = Power(2, 8);

            foreach (int i in listOfInts)
                Console.Write("{0} ", i);
        }


        [Test]
        public void PowerYieldEager_WhenPass2AndWant8Numbers_ReturnAnEnumerableOfInts()
        {
            //deferred but eager execution
            IEnumerable listOfInts = PowerYieldEager(2, 8);

            foreach (int i in listOfInts)
                Console.Write("{0} ", i);
        }


        [Test]
        public void PowerYield_WhenPass2AndWant8Numbers_ReturnAnEnumerableOfIntsOneAtATime()
        {
            //deferred and lazy execution
            IEnumerable listOfInts = PowerYieldLazy(2, 8);

            foreach (int i in listOfInts)
                Console.Write("{0} ", i);
        }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 7

它不具有使用yield-最终你可以做一切yield做,通过编写自定义枚举(IEnumerator[<T>])和延缓的作用,直到第一个MoveNext().但是,实施起来非常痛苦.当然,如果你使用yield,实施默认情况下延迟(您可以通过两种方法也非递延-一个不使用yield,然后访问数据使用其他方法(迭代器块)实施枚举.

坦率地说,编写调查员很困难,也很麻烦.除非绝对必要,否则我会避免它 迭代器块很棒.