En LINQ Where
es un operador de transmisión. Where-as OrderByDescending
no es un operador de streaming. AFAIK, un operador de streaming solo reúne el siguiente elemento que es necesario. Un operador que no realiza streaming evalúa todo el flujo de datos a la vez.¿En qué se diferencia un operador de transmisión de la ejecución diferida?
No veo la importancia de definir un operador de transmisión. Para mí, es redundante con ejecución diferida. Tome el ejemplo donde escribí una extensión personalizada y la consumí usando el operador where y orderby.
public static class ExtensionStuff
{
public static IEnumerable<int> Where(this IEnumerable<int> sequence, Func<int, bool> predicate)
{
foreach (int i in sequence)
{
if (predicate(i))
{
yield return i;
}
}
}
}
public static void Main()
{
TestLinq3();
}
private static void TestLinq3()
{
int[] items = { 1, 2, 3,4 };
var selected = items.Where(i => i < 3)
.OrderByDescending(i => i);
Write(selected);
}
private static void Write(IEnumerable<int> selected)
{
foreach(var i in selected)
Console.WriteLine(i);
}
En cualquier caso Where
, tiene que evaluar cada elemento con el fin de determinar qué elementos cumple la condición. El hecho de que rinda parece ser relevante solo porque el operador obtiene una ejecución diferida.
Entonces, ¿cuál es la importancia de los operadores de transmisión por secuencias?
Inténtalo de nuevo con aproximadamente 2 mil millones de entradas en 'artículos'. – cHao
@cHao o una secuencia infinita, o una secuencia derivada de una secuencia de red abierta. –
[Ejemplo más específico] (http://codereview.stackexchange.com/a/9777/8246) –