Some help understanding “yield”

前端 未结 8 1181
挽巷
挽巷 2020-11-30 01:41

In my everlasting quest to suck less I\'m trying to understand the \"yield\" statement, but I keep encountering the same error.

The body of [someMetho

8条回答
  •  一个人的身影
    2020-11-30 02:20

    @Ian P´s answer helped me a lot to understand yield and why it is used. One (major) use case for yield is in "foreach" loops after the "in" keyword not to return a fully completed list. Instead of returning a complete list at once, in each "foreach" loop only one item (the next item) is returned. So you will gain performance with yield in such cases. I have rewritten @Ian P´s code for my better understanding to the following:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace YieldReturnTest
    {
        public class PrimeFinder
        {
            private Boolean isPrime(int integer)
            {
                if (0 == integer)
                    return false;
    
                if (3 > integer)
                    return true;
    
                for (int i = 2; i < integer; i++)
                {
                    if (0 == integer % i)
                        return false;
                }
                return true;
            }
    
            public IEnumerable FindPrimesWithYield()
            {
                int i;
    
                for (i = 1; i < 2147483647; i++)
                {
                    if (isPrime(i))
                    {
                        yield return i;
                    }
                }
            }
    
            public IEnumerable FindPrimesWithoutYield()
            {
                var primes = new List();
                int i;
                for (i = 1; i < 2147483647; i++)
                {
                    if (isPrime(i))
                    {
                        primes.Add(i);
                    }
                }
                return primes;
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                PrimeFinder primes = new PrimeFinder();
    
                Console.WriteLine("Finding primes until 7 with yield...very fast...");
                foreach (int i in primes.FindPrimesWithYield()) // FindPrimesWithYield DOES NOT iterate over all integers at once, it returns item by item
                {
                    if (i > 7)
                    {
                        break;
                    }
                    Console.WriteLine(i);
                    //Console.ReadLine();
    
                }
    
                Console.WriteLine("Finding primes until 7 without yield...be patient it will take lonkg time...");
                foreach (int i in primes.FindPrimesWithoutYield()) // FindPrimesWithoutYield DOES iterate over all integers at once, it returns the complete list of primes at once
                {
                    if (i > 7)
                    {
                        break;
                    }
                    Console.WriteLine(i);
                    //Console.ReadLine();
                }
    
                Console.ReadLine();
                Console.ReadLine();
            }
        }
    }
    

提交回复
热议问题