Operador yield no C#
Hoje encontrei um operador no C# que desconhecia, o yield.
Ele serve para manter estado quando se percorre uma coleção de objetos, e está intimente ligado à implementação do pattern Iterator dentro do C#. Na prática, ele pode ser aplicado quando temos métodos que retornam um IEnumerable .
No exemplo abaixo, eu tenho um método que percorre as datas de finais de semana (Sábado e Domingo) dado um ano. Veja que este método é chamado dentro de um foreach, e cada iteração ele exibe uma data na tela. Não estou preocupado, dentro do foreach, em saber qual foi a última data que foi exibida, isso é controlado internamente durante a iteração, que vai mantendo o loop "ativo" através do operador yield.
Feliz Natal e até a próxima!
using System;
using System.Collections.Generic;
namespace TesteYield
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Finais de semana de 2009:");
foreach (DateTime data in ObterFinaisDeSemana(2009))
Console.WriteLine("{0:dd/MM/yyyy}", data);
Console.ReadKey(true);
}
private static IEnumerable<DateTime>ObterFinaisDeSemana(int ano)
{
DateTime pivo = new DateTime(ano, 1, 1);
while (pivo.Year == ano)
{
if (pivo.DayOfWeek == DayOfWeek.Sunday pivo.DayOfWeek == DayOfWeek.Saturday)
yield return pivo;
pivo = pivo.AddDays(1);
}
}
}
}
Comentários
Postar um comentário