In LINQ Where
è un operatore di streaming. Dove-come OrderByDescending
è un operatore non di streaming. AFAIK, un operatore di streaming raccoglie solo l'elemento successivo che è necessario. Un operatore non di streaming valuta l'intero flusso di dati contemporaneamente.Come si differenzia un operatore di streaming dall'esecuzione differita?
Non riesco a vedere la rilevanza della definizione di un operatore di streaming. Per me, è ridondante con la Deferred Execution. Prendi l'esempio in cui ho scritto un'estensione personalizzata e l'ho consumata usando l'operatore where e 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);
}
In entrambi i casi, Where
deve valutare ogni elemento per determinare quali elementi soddisfano la condizione. Il fatto che produca sembra diventare rilevante solo perché l'operatore ottiene un'esecuzione differita.
Quindi, qual è l'importanza degli operatori di streaming?
Provatelo ancora con circa 2 miliardi di pollici in 'articoli'. – cHao
@cHao o una sequenza infinita o una sequenza derivata da un flusso di rete aperto. –
[Esempio più specifico] (http://codereview.stackexchange.com/a/9777/8246) –