流模式(延遲評估)與非流模式(急切評估)

在使用延遲執行的 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 生成值,所以必須首先評估所有元素,以便確定哪個是最小的,哪個是下一個最小的,依此類推。這稱為非流模式急切評估

可以在 MSDN - C#VB.NET 中找到特定 LINQ 方法是使用流式還是非流式模式。