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#).