Continuando a série “Eu adoro”, agora é a vez do C#.

Já usaram o yield? É algo já não tão novo, apareceu no C# 2.0, e só existe no C#, não existe no VB.

O yield serve para gerar um Enumerable on demand. Por exemplo, se você quiser criar uma coleção de inteiros rapidamente, como faz? Veja abaixo, com yield:

public static IEnumerable<int> GetNums(int from, int to)
{
    for (int i = from; i <= to; i++)
        yield return i;
}

Legal, né? Para usar é fácil, verificamos com um teste:

[TestMethod()]
public void GetNumsTest()
{
    var nums = Class1.GetNums(2, 5);
    Assert.AreEqual(4, nums.Count());
    Assert.IsTrue(nums.Contains(2));
    Assert.IsTrue(nums.Contains(3));
    Assert.IsTrue(nums.Contains(4));
    Assert.IsTrue(nums.Contains(5));
}

Gosto bastante também do exemplo do MSDN:

public static IEnumerable<int> Power(int number, int exponent)
{
    int counter = 0;
    int result = 1;
    while (counter++ < exponent)
    {
        result = result * number;
        yield return result;
    }
}

Mais uma vez, para testar:

[TestMethod]
public void PowerTest()
{
    var nums = Class1.Power(2, 5);
    Assert.AreEqual(5, nums.Count());
    Assert.IsTrue(nums.Contains(2));
    Assert.IsTrue(nums.Contains(4));
    Assert.IsTrue(nums.Contains(8));
    Assert.IsTrue(nums.Contains(16));
    Assert.IsTrue(nums.Contains(32));
}

Mas o yield não é para ser usado somente com inteiros, você pode usá-lo para retornar um IEnumerable de qualquer coisa. Aqui um exemplo com strings:

public static IEnumerable<string> GetWordsUpper(string phrase)
{
    foreach (var word in phrase.Split(' '))
    {
        yield return word.ToUpper();
    }
}

Para testar é fácil:

[TestMethod]
public void GetWordsUppderTest()
{
    var palavras = Class1.GetWordsUpper("ola como vai?");
    Assert.AreEqual(3, palavras.Count());
    Assert.IsTrue(palavras.Contains("OLA"));
    Assert.IsTrue(palavras.Contains("COMO"));
    Assert.IsTrue(palavras.Contains("VAI?"));
}

Você pode levar isso longe, como obtenção de dados do banco, obtenção de input do usuário, tudo somente quando precisar, e por aí vai.

E você, já usou o yield? Gosta? Onde? Comente aqui.

Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.