Compartir por


Ejemplo de consultas de cadena (C#) (LINQ to XML)

Este ejemplo se basa en el ejemplo de ejecución diferida y muestra lo que sucede cuando se encadenan dos consultas que ambas usan la ejecución diferida y la evaluación perezosa.

Ejemplo: Adición de un segundo método de extensión que usa yield return para aplazar la ejecución

En este ejemplo, se introduce otro método de extensión, , AppendStringque anexa una cadena especificada a cada cadena de la colección de origen y, a continuación, produce la cadena modificada.

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

En este ejemplo se genera la siguiente salida:

ToUpper: source >abc<
AppendString: source >ABC<
Main: str >ABC!!!<

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

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

En este ejemplo, puede ver que cada método de extensión funciona de uno en uno para cada elemento de la colección de origen.

Lo que debe quedar claro en este ejemplo es que, aunque hemos encadenado consultas que producen colecciones, no se materializan colecciones intermedias. En su lugar, cada elemento se pasa de un método diferido al siguiente. Esto da como resultado una superficie de memoria mucho menor que un enfoque que primero tomaría una matriz de cadenas, luego crear una segunda matriz de cadenas que se han convertido en mayúsculas y, por último, crear una tercera matriz de cadenas donde cada cadena tiene los signos de exclamación anexados.

En el siguiente artículo de este tutorial se muestra la materialización intermedia:

Consulte también