Comparteix a través de


Encadenamiento de operadores de consulta estándar juntos (C#) (LINQ to XML)

Los operadores de consulta estándar se pueden encadenar juntos. Por ejemplo, puede interjetar el operador Enumerable.Where (invocado por la cláusula where) y funciona de forma diferida; es decir, no lo materializan los resultados intermedios.

Ejemplo: Interjeción de una cláusula where

En este ejemplo, se llama al método Where antes de llamar a ConvertCollectionToUpperCase. El método Where funciona casi exactamente de la misma manera que los métodos diferidos utilizados en los ejemplos anteriores de este tutorial, ConvertCollectionToUpperCase y AppendString.

Una diferencia es que en este caso, el método Where recorre en iteración su recopilación de origen, determina que el primer elemento no pasa el predicado y después obtiene el siguiente elemento, que lo pasa. A continuación produce el segundo elemento.

No obstante, la idea básica es la misma: las recopilaciones intermedias no se materializan a menos que deban hacerlo.

Cuando se utilizan expresiones de consulta, se convierten en llamadas a operadores de consulta estándar y se aplican los mismos principios.

Todos los ejemplos de esta sección que consultan documentos XML abierto de Office utilizan el mismo principio. La ejecución aplazada y la evaluación diferida son algunos de los conceptos fundamentales que debe comprender para utilizar LINQ y LINQ to XML de forma efectiva.

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();
        }
    }
}

Este ejemplo produce el siguiente resultado:

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

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

Este es el artículo final del tutorial Tutorial: Encadenar consultas juntas (C#).