流模式(延遲評估)與非流模式(急切評估)
在使用延遲執行的 LINQ 方法中,有些需要一次評估一個值。以下程式碼:
var lst = new List<int>() {3, 5, 1, 2};
var streamingQuery = lst.Select(x => {
Console.WriteLine(x);
return x;
});
foreach (var i in streamingQuery) {
Console.WriteLine($"foreach iteration value: {i}");
}
將輸出:
3
foreach 迭代值:3
5
foreach 迭代值:5
1
foreach 迭代值:1
2
foreach 迭代值:2
因為傳遞給 Select
的函式是在 foreach
的每次迭代中計算的。這稱為流模式或惰性評估 。
其他 LINQ 方法 - 排序和分組運算子 - 需要評估所有值,然後才能返回任何值:
var nonStreamingQuery = lst.OrderBy(x => {
Console.WriteLine(x);
return x;
});
foreach (var i in nonStreamingQuery) {
Console.WriteLine($"foreach iteration value: {i}");
}
將輸出:
3
5
1
2
foreach 迭代值:1
foreach 迭代值:2
foreach 迭代值:3
foreach 迭代值:5
在這種情況下,因為必須以遞增的順序為 foreach
生成值,所以必須首先評估所有元素,以便確定哪個是最小的,哪個是下一個最小的,依此類推。這稱為非流模式或急切評估 。