Compartilhar via


Encadear operadores de consulta padrão (C#) (LINQ to XML)

Os operadores de consulta padrão podem ser encadeados. Por exemplo, você pode interromper o Enumerable.Where operador (invocado pela cláusula where) e ele operar de forma lenta; ou seja, sem materializar resultados intermediários.

Exemplo: interromper uma cláusula where

Nesse exemplo, o método de Where é chamado antes de chamar ConvertCollectionToUpperCase. O método de Where opera quase exatamente a mesma maneira que os métodos lentos usados em exemplos anteriores neste tutorial, ConvertCollectionToUpperCase e AppendString.

Uma diferença é que, nesse caso, o método Where itera por meio da coleção de origem, determina que o primeiro item não passa o predicado e, em seguida, obtém e passa o item seguinte. Produz no segundo item.

Entretanto, a exibição básica é a mesma: as coleções intermediários não são materializadas, a menos que necessário.

Quando são usadas expressões de consulta, elas são convertidas em chamadas aos operadores de consulta padrão e os mesmos princípios se aplicam.

Todos os exemplos nesta seção que estão vendo documentos do Office Open XML usam o mesmo princípio. Execução adiada e avaliação lenta são alguns conceitos fundamentais que você deve compreender para usar efetivamente o LINQ e o LINQ to XML.

public static class LocalExtensions
{
    public static IEnumerable<string>
      ConvertCollectionToUpperCase(this IEnumerable<string> source)
    {
        foreach (string str in source)
        {
            Console.WriteLine("ToUpper: source >{0}<", str);
            yield return str.ToUpper();
        }
    }

    public static IEnumerable<string>
      AppendString(this IEnumerable<string> source, string stringToAppend)
    {
        foreach (string str in source)
        {
            Console.WriteLine("AppendString: source >{0}<", str);
            yield return str + stringToAppend;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        string[] stringArray = { "abc", "def", "ghi" };

        IEnumerable<string> q1 =
            from s in stringArray.ConvertCollectionToUpperCase()
            where s.CompareTo("D") >= 0
            select s;

        IEnumerable<string> q2 =
            from s in q1.AppendString("!!!")
            select s;

        foreach (string str in q2)
        {
            Console.WriteLine("Main: str >{0}<", str);
            Console.WriteLine();
        }
    }
}

Esse exemplo gera a saída a seguir:

ToUpper: source >abc<
ToUpper: source >def<
AppendString: source >DEF<
Main: str >DEF!!!<

ToUpper: source >ghi<
AppendString: source >GHI<
Main: str >GHI!!!<

Este é o tópico final do Tutorial: Encadear Consultas (C#).