Zum Inhalt springen
  • 0

Was ist der Unterschied zw. IEnumerable yield return und foreach?


 Teilen

Frage

Hallo!

Ich habe heute im E-Learning Kurs gesehen, wie der Dozent Methoden variante 1 codiert hat.
Ich hätte das ganze mit Methoden Variante 2 gelöst.

Gibt es bei Methoden variante 1 Vorteile? Bzw. wo ist der genaue Unterschied?  Was ist ein "yield" return?

Methoden variante 1:

    public IEnumerable<Friend> GetAll()
        {
            //TODO: Load data from real database
            yield return new Friend { FirstName = "Thomas", LastName = "Huber" };
            yield return new Friend { FirstName = "Andres", LastName = "Boehler" };
            yield return new Friend { FirstName = "Julia", LastName = "Huber" };
            yield return new Friend { FirstName = "Chrissi", LastName = "Egin" };
        }
    }

Methoden variante 2:

     public List<Friend> GetAll()
        {
            List<Friend> friend = new List<Friend>();
            friend.Add(new Friend { FirstName = "Thomans", LastName = "Huber" });
            friend.Add(new Friend { FirstName = "Andres", LastName = "Boehler" });
            friend.Add(new Friend { FirstName = "Julia", LastName = "Huber" });
            friend.Add(new Friend { FirstName = "Chrissi", LastName = "Egin" });

            return friend;
        }

 

Bearbeitet von InTheVoid
Link zu diesem Kommentar
Auf anderen Seiten teilen

4 Antworten auf diese Frage

Empfohlene Beiträge

  • 0

Variante 1 stellt ein Datenstrom dar. Diese Variante hat den Vorteil, dass man unendlich viele Datensätze an den Aufrufer senden kann, ohne den Speicher groß beanspruchen zu müssen, da immer nur der jeweilige Datensatz im speicher ist, der gerade mit yield return zurückgegeben wird. Du willst z.B. alle Namen der Freunde auf dem Bildschirm ausgeben:

foreach(var friend in this.GetAll())
    Console.WriteLine($"{friend.FirstName} {friend.LastName}");

In der ersten Variante wird also nun der erste Datensatz per yield return an die foreach-Schleife zurückgeben. Es wird sich dann die Stelle gemerkt, wo er sich gerade in der GetAll()-Methode befindet. In der foreach-Schleife wird dann der Name des Freundes auf der Konsole ausgeben. Dann fängt die Schleife von Vorne an und geht wieder zurück nach GetAll(). Da sich gemerkt wurde, in welcher Zeile er sich befindet, geht er nun zur nächsten Zeile und führt wieder ein yield return aus. usw, bis die GetAll()-Methode komplett durchlaufen ist.

In der zweiten Variante wird allerdings eine Liste erzeugt und alle Datensätze werden in diese Liste gespeichert und wird zurückgegeben. Damit haben wir nun 4 Datensätze im Speicher und wir verbrauchen somit mehr Arbeitsspeicher.

Stell dir vor, du bekommst die Datensätze nun aus einer Datenbank und in der Datenbank sind 10 Mio. Datensätze gespeichert. Mit einem yield return könnte man diese Menge ohne Probleme abarbeiten. Mit der zweiten Variante würde aber der Speicher platzen, da wir mit Sicherheit nicht so viel Arbeitsspeicher haben, um die 10 Mio. Datensätze zu speichern.

Der Nachteil von Variante 1 ist allerdings, dass wir im Datenstrom nicht zurückspringen können, wie bei einer Liste. Wir können also immer nur den nächsten Datensatz abrufen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Man sollte hier evtl. hinzufügen, dass wenn es mit Datenbankoperationen (hier mit DbContext) verbunden ist, eine Operation über eine Range (AddRange, RemoveRange) meist zu bevorzugen ist, als für jeden einzelnen Datensatz eine Operation auszuführen.

Auch geht es um Lesbarkeit. Statt in einem Code 15 foreach Loops zu haben, kann man auch mal ein ItemList.Select(DoStuff) hinschreiben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

 Teilen

Fachinformatiker.de, 2022 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...

Wichtige Information

Fachinformatiker.de verwendet Cookies. Mehr dazu in unserer Datenschutzerklärung