LINQWhere
ではストリーミング演算子です。一方OrderByDescending
、非ストリーミング演算子です。AFAIK、ストリーミングオペレーターは、必要な次のアイテムのみを収集します。非ストリーミングオペレータは、データストリーム全体を一度に評価します。
ストリーミング演算子を定義することの関連性がわかりません。私にとって、それは遅延実行と冗長です。カスタム拡張を記述し、where演算子と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);
}
いずれの場合も、Where
どの要素が条件を満たすかを判断するために、各要素を評価する必要があります。それが得られるという事実は、オペレーターが延期された実行を獲得するためにのみ関連するように思われます。
では、ストリーミング演算子の重要性は何ですか?