Linq foreach語句概述
Linq 有很多值得學習的地方,這里我們主要介紹Linq foreach語句,包括介紹foreach循環(huán)來強制執(zhí)行查詢等方面。
實際的查詢執(zhí)行會延遲到在Linq foreach語句中循環(huán)訪問查詢變量時發(fā)生。此概念稱為“延遲執(zhí)行”,下面的示例對此進行了演示:
- //Query execution.
- foreach (int num in numQuery)
- {
- Console.Write("{0,1} ", num);
- }
Linq foreach語句也是檢索查詢結果的地方。例如,在上一個查詢中,迭代變量 num 保存了返回的序列中的每個值(一次保存一個值)。
由于查詢變量本身從不保存查詢結果,因此可以根據(jù)需要隨意執(zhí)行查詢。例如,可以通過一個單獨的應用程序持續(xù)更新數(shù)據(jù)庫。在應用程序中,可以創(chuàng)建一個檢索***數(shù)據(jù)的查詢,并可以按某一時間間隔反復執(zhí)行該查詢以便每次檢索不同的結果。
對一系列源元素執(zhí)行聚合函數(shù)的查詢必須首先循環(huán)訪問這些元素。Count、Max、Average 和 First 就屬于此類查詢。由于查詢本身必須使用 foreach 以便返回結果,因此這些查詢在執(zhí)行時不使用顯式Linq foreach語句。另外還要注意,這些類型的查詢返回單個值,而不是 IEnumerable 集合。下面的查詢返回源數(shù)組中偶數(shù)的計數(shù):
- var evenNumQuery =
- from num in numbers
- where (num % 2) == 0
- select num;
- int evenNumCount = evenNumQuery.Count();
若要強制立即執(zhí)行任意查詢并緩存其結果,可以調用 ToList<(Of <(TSource>)>) 或 ToArray<(Of <(TSource>)>) 方法。
- List<int> numQuery2 =
- (from num in numbers
- where (num % 2) == 0
- select num).ToList();
- //or like this:
- //numQuery3 is still an int[]
- var numQuery3 =
- (from num in numbers
- where (num % 2) == 0
- select num).ToArray();
此外,還可以通過在緊跟查詢表達式之后的位置放置一個 foreach 循環(huán)來強制執(zhí)行查詢。但是,通過調用 ToList 或 ToArray,也可以將所有數(shù)據(jù)緩存在單個集合對象中。
【編輯推薦】