Jump to content
  • 0

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

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

Diesen Beitrag teilen


Link zum Beitrag
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.

Diesen Beitrag teilen


Link zum Beitrag
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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

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

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

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


Fachinformatiker.de, 2020 SE Internet Services

fidelogo_small.png

if_icon-6-mail-envelope-closed_314900.pnSchicken Sie uns eine Nachricht!

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

Fachinformatiker.de App


Get it on Google Play

Kontakt

Hier werben?
Oder senden Sie 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