yield break en vroegtijdige beëindiging
Stop iteratie voorwaardelijk.
yield break en vroegtijdige beëindiging is een gratis C# Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C# Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C# Academy bevat in totaal 4 lessen.
Een iterator vroegtijdig stoppen
Soms wil je dat een iterator stopt met het produceren van waarden voordat het natuurlijke einde is bereikt. De instructie yield break beëindigt de reeks onmiddellijk, zoals return voor iterators.
Basisgebruik van yield break
yield break beëindigt de iterator. Er worden geen verdere waarden geproduceerd en de foreach-lus die de iterator gebruikt, eindigt.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> UpToFive()
{
for (int i = 1; i <= 100; i++)
{
if (i > 5) yield break;
yield return i;
}
}
public static void Main()
{
foreach (var n in UpToFive())
Console.WriteLine(n);
}
}Waarden nemen zolang een voorwaarde waar is
Een veelgebruikt patroon is om alleen waarden op te leveren zolang een voorwaarde waar is en daarna te stoppen. Met yield break blijft dit overzichtelijk.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> WhileSmall(IEnumerable<int> nums)
{
foreach (var n in nums)
{
if (n >= 10) yield break;
yield return n;
}
}
public static void Main()
{
foreach (var n in WhileSmall(new[] { 2, 4, 8, 12, 3 }))
Console.WriteLine(n);
}
}Bewakingsclausules met yield break
Je kunt yield break bovenaan een iterator als bewakingsclausule gebruiken. Als de invoer leeg of ongeldig is, retourneer je helemaal geen elementen.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
static IEnumerable<string> Lines(string text)
{
if (string.IsNullOrEmpty(text)) yield break;
foreach (var line in text.Split('\n'))
yield return line;
}
public static void Main()
{
foreach (var l in Lines("a\nb\nc"))
Console.WriteLine(l);
Console.WriteLine("empty count: " + Lines("").Count());
}
}Het aantal uitvoerwaarden beperken
Gebruik een teller samen met yield break om het aantal elementen dat een iterator produceert te beperken, zelfs bij een lange bronreeks.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Take(IEnumerable<int> source, int max)
{
int count = 0;
foreach (var item in source)
{
if (count++ >= max) yield break;
yield return item;
}
}
public static void Main()
{
foreach (var n in Take(new[] { 1, 2, 3, 4, 5 }, 3))
Console.WriteLine(n);
}
}break van de aanroeper versus yield break
Een reeks kan op twee manieren eindigen. De aanroeper kan stoppen met opvragen met break, of de iterator kan stoppen met produceren met yield break. Beide beëindigen de lus, maar om verschillende redenen.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Counting()
{
int i = 1;
while (true) yield return i++;
}
public static void Main()
{
// Caller decides to stop with break
foreach (var n in Counting())
{
if (n > 3) break;
Console.WriteLine(n);
}
}
}yield break beëindigt alleen de huidige iterator
yield break verlaat de iteratormethode waarin deze instructie staat, maar niet een buitenste lus in de aanroeper. De besturing gaat terug naar degene die de iterator doorliep.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Bounded(IEnumerable<int> nums, int limit)
{
foreach (var n in nums)
{
if (n > limit) yield break; // ends Bounded only
yield return n;
}
}
public static void Main()
{
var result = Bounded(new[] { 1, 2, 9, 3 }, 5);
Console.WriteLine("iterator created, still running");
foreach (var n in result) Console.WriteLine(n);
}
}Geen yield return na yield break
Zodra yield break wordt uitgevoerd, is de iterator klaar. Code die in hetzelfde pad fysiek daarna staat, kan geen waarden meer produceren.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Demo(bool stopEarly)
{
yield return 1;
if (stopEarly) yield break;
yield return 2;
yield return 3;
}
public static void Main()
{
Console.WriteLine("stopEarly = true:");
foreach (var n in Demo(true)) Console.WriteLine(n);
Console.WriteLine("stopEarly = false:");
foreach (var n in Demo(false)) Console.WriteLine(n);
}
}Filteren en vroegtijdig stoppen combineren
Je kunt filteren en beëindigen in dezelfde iterator: sla sommige waarden over, lever andere op en stop volledig zodra er een stopwaarde verschijnt.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> UntilZero(IEnumerable<int> nums)
{
foreach (var n in nums)
{
if (n == 0) yield break; // stop at sentinel
if (n < 0) continue; // skip negatives
yield return n;
}
}
public static void Main()
{
foreach (var n in UntilZero(new[] { 3, -1, 5, 0, 9 }))
Console.WriteLine(n);
}
}yield break en finally-blokken
Als je iterator een try/finally bevat, wordt finally nog steeds uitgevoerd wanneer yield break de reeks beëindigt. Zo wordt opruimen, zoals het sluiten van resources, gegarandeerd.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> WithCleanup()
{
try
{
yield return 1;
yield break;
}
finally
{
Console.WriteLine("cleanup ran");
}
}
public static void Main()
{
foreach (var n in WithCleanup())
Console.WriteLine(n);
}
}Probeer het zelf
Combineer filteren met vroegtijdig beëindigen: geef positieve getallen terug, maar stop volledig zodra hun lopende som een limiet overschrijdt.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> WithinBudget(IEnumerable<int> nums, int budget)
{
int spent = 0;
foreach (var n in nums)
{
if (n <= 0) continue;
if (spent + n > budget) yield break;
spent += n;
yield return n;
}
}
public static void Main()
{
foreach (var n in WithinBudget(new[] { 3, -2, 4, 5, 1 }, 10))
Console.WriteLine(n);
}
}Korte controle
Denk na over de rol van yield break.
Samenvatting
yield break beëindigt een iterator voortijdig.
- Het werkt als een
returnzonder waarde voor iterators. - Gebruik het voor take-while-logica, controles en limieten voor aantallen.
- Het beëindigt alleen de iterator, niet de lus van de aanroeper.
finally-blokken worden nog steeds uitgevoerd, zodat opruimen gegarandeerd is.
Leer C# met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 93
- Lessen
- 346
Veelgestelde vragen
Is de les “yield break en vroegtijdige beëindiging” gratis?
Ja — de volledige tekst van “yield break en vroegtijdige beëindiging” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus C# Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus C# Academy bevat in totaal 4 lessen.
Wat leer ik in “yield break en vroegtijdige beëindiging”?
Stop iteratie voorwaardelijk. Je oefent met C# Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met C# Academy te beginnen?
Ervaring vooraf is niet nodig. C# Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “yield break en vroegtijdige beëindiging”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over C# Academy?
Ja. Elke les over C# Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Iteratormethoden met yield return
- yield break en vroegtijdige beëindiging
- Semantiek van luie evaluatie
- Aangepaste enumerables