11.1.4 推遲查詢的執行
在執行期間定義查詢表示式時,查詢就不會執行,查詢會在迭代資料項時執行。
比如說擴充套件方法where()。它使用yield return語句返回謂詞為true的元素。因為使用了yield return語句,所以編譯器會建立乙個列舉器,在訪問列舉中的項後,就返回它們。
publicstatic ienumerablewhere(this ienumerablesource, funcbool>predicate)
}
這是乙個非常有趣也非常重要的結果。在下面的例子中,建立了string元素的乙個集合,用名稱arr填充它。接著定義乙個查詢,從集合中找出以字母j開頭的所有名稱。集合也應是排序好的。在定義查詢時,不會進行迭代。相反,迭代在foreach語句中進行,在其中迭代所有的項。集合中只有乙個元素juan滿足where表示式的要求,即以字母j開頭。迭代完成後,將juan寫入控制台。之後在集合中新增4個新名稱,再次進行迭代。
var names = new list;var nameswithj = from n in
names
where n.startswith("j"
)
orderby
n
select
n;console.writeline(
"first iteration");
foreach(string name in
nameswithj)
console.writeline();
names.add(
"john");
names.add(
"jim");
names.add(
"jack");
names.add(
"denny");
console.writeline(
"second iteration");
foreach(string name in
nameswithj)
因為迭代在查詢定義時不會進行,而是在執行每個foreach語句時進行,所以可以看到其中的變化,如應用程式的結果所示:
first iterationjuan
second iteration
jack
jimjohn
juan
當然,還必須注意,每次在迭代中使用查詢時,都會呼叫擴充套件方法。在大多數情況下,這是非常有效的,因為我們可以檢測出資料來源中的變化。但是在一些情況下,這是不可行的。呼叫擴充套件方法toarray()、toenumerable()、tolist()等可以改變這個操作,在示例中,tolist遍歷集合,返回乙個實現了ilist的集合。之後對返回的列表遍歷兩次,在兩次迭代之間,資料來源得到了新名稱。
var names = new list;var nameswithj = (from n in
names
where n.startswith("j"
)
orderby
n
select
n).tolist();
console.writeline(
"first iteration");
foreach(string name in
nameswithj)
console.writeline();
names.add(
"john");
names.add(
"jim");
names.add(
"jack");
names.add(
"denny");
console.writeline(
"second iteration");
foreach(string name in
nameswithj)
在結果中可以看到,在兩次迭代之間輸出保持不變,但集合中的值改變了:
first iterationjuan
second iteration
juan
——摘自 《c#高階程式設計(第七版)》 第189頁
延遲查詢 LINQ
1.linq查詢使用的是延遲查詢的方法,以便提高效率 1 public static ienumerablewhere this ienumerablesource,2 funcbool predicate 310 11 因為使用yield return,所以編譯器會建立乙個列舉器,在訪問列舉項後,...
LINQ中的 延遲查詢 特性
很多標準查詢操作符的設計原型都是返回乙個ienumerable型別的序列,這些標準查詢操作實際上不會在 執行到那一行的時候就返回乙個序列,事實上返回的是乙個物件.當在列舉 比如foreach 這個物件的時候會從ienumerable序列中生成乙個元素,這個時候才會真正執行查詢操作.這就是所謂的 延遲...
Linq 延遲執行
使用linq時,其中乙個重要概念就是延遲執行,所有的謂詞求值需要等到觸發時才會被呼叫。在宣告時,它們是不執行的,除非呼叫lambda表示式,造成其中的 開始執行,否則不會被執行。如果lambda表示式執行的代價比較高 如呼叫資料庫,密集計算等 那麼為了優化 通過使用 to 方法來轉換為集合方式,減少...