從輸出結果可以看出,查詢時並沒有立即計算結果,而是輸出時才進行計算。
其實在構造查詢語句時,只是傳遞的相應操作的委托,並沒有真正執行查詢操作,真正的執行是在 IEnumerator<T> 的 GetEnumerator() 方法中執行的,每取得一個元素就執行一次。延遲執行還有個好處是改變數據源時不需要構造新的查詢語句即可執行獲得想要的結果。
示例:
static void Main()
{
// 原始集合
int[] collection = { 10, 11, 12, 13, 14 };
// 查詢集合
var result = from i in collection
select DoubleInt(i);
// 輸出原集合
foreach (var i in result)
{
Console.WriteLine(i);
}
Console.WriteLine("Change data source:");
// 改變集合
for (var i = 0; i < collection.Length; i++)
{
collection[i] += 10;
}
// 輸出改變後的集合
foreach (var i in result)
{
Console.WriteLine(i);
}
}
static int DoubleInt(int i)
{
return i * 2;
}
// 結果:// 20
// 22
// 24
// 26
// 28
// Change data source:
// 40
// 42
// 44
// 46
// 48