Zählen bis unendlich und zwar 2mal !

 

Ein Enumerator kann so geschrieben werden dass er ein Enumerable indefiniter Länge erzeugen kann.  Der Iterator wird in diesem Fall ausgeführt solange weitere Elemente erfragt werden bzw. eine vordefinierte Grenze erreicht ist.

Dieser C# Iterator hier erzeugt Primzahlen, das Besondere an dieser Stelle ist dass wir den Iterator trotz unendlicher Schleife verwenden können, denn die Schleife wird nur solange ausgeführt wie nötig.

        static void Main(string[] args)
        {
            Console.Write("Gib die Grenze an:");
            int oberesLimit = int.Parse(Console.ReadLine());

            foreach (int p in AllePrimzahlen())
            {
                if (p > oberesLimit)
                    break;
                Console.WriteLine(p);
            }

            Console.ReadLine();
        }

        private static IEnumerable<int> AllePrimzahlen()
        {
            List<int> primzahlen = new List<int>();
            primzahlen.Add(2);
            yield return 2;
            primzahlen.Add(3);
            yield return 3;

            int testPrime = 5;
            while (true)
            {
                bool isPrime = true;
                foreach (int n in primzahlen)
                {
                    if (testPrime % n == 0)
                    {
                        isPrime = false;
                        break;
                    }
                }

                if (isPrime)
                {
                    primzahlen.Add(testPrime);
                    yield return testPrime;
                }
                testPrime += 2;
            }
        }



Wie man hier sieht wird jedes mal wenn eine yield return-Anweisung im Iterator erreicht wird, eine expression returned. So kann AllePrimzahlen sich Stück für Stück aufbauen.
Und für jeden der jetzt denkt:
Iteratoren, yield-Statement… WTH !
Bei der ppedv gibt es auch einen Kurs zum Einstieg in C#.

Kommentare sind geschlossen