Оператор yield break
приводит к останову перечисления. По сути, yield break
завершает перечисление без возврата каких-либо дополнительных элементов.
Учтите, что на самом деле метод итератора может остановить итерацию двумя способами. В одном случае логика метода могла естественным образом выйти из метода после возврата всех элементов. Вот пример:
IEnumerable<uint> FindPrimes(uint startAt, uint maxCount)
{
for (var i = 0UL; i < maxCount; i++)
{
startAt = NextPrime(startAt);
yield return startAt;
}
Debug.WriteLine("All the primes were found.");
}
В приведенном выше примере метод итератора естественным образом прекратит выполнение, как только будет найдено maxCount
простых чисел.
Оператор yield break
- это еще один способ для итератора прекратить перечисление. Это способ вырваться из перечня рано. Здесь тот же метод, что и выше. На этот раз метод имеет ограничение на количество времени, которое метод может выполнить.
IEnumerable<uint> FindPrimes(uint startAt, uint maxCount, int maxMinutes)
{
var sw = System.Diagnostics.Stopwatch.StartNew();
for (var i = 0UL; i < maxCount; i++)
{
startAt = NextPrime(startAt);
yield return startAt;
if (sw.Elapsed.TotalMinutes > maxMinutes)
yield break;
}
Debug.WriteLine("All the primes were found.");
}
Обратите внимание на звонок на yield break
. По сути, он рано выходит из перечисления.
Обратите внимание, что yield break
работает иначе, чем просто break
. В приведенном выше примере yield break
выходит из метода без вызова Debug.WriteLine(..)
.