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

Postagens mais visitadas deste blog

Trocando configurações padrão do Live TIM

Uma proposta de Clean Architecure com Modelo de Atores

Testes automatizados em sistemas autenticados com certificados digitais, usando Selenium e PhantomJS