LINQ延遲查詢

2022-01-12 01:46:58 字數 2180 閱讀 9726

11.1.4 推遲查詢的執行

在執行期間定義查詢表示式時,查詢就不會執行,查詢會在迭代資料項時執行。

比如說擴充套件方法where()。它使用yield return語句返回謂詞為true的元素。因為使用了yield return語句,所以編譯器會建立乙個列舉器,在訪問列舉中的項後,就返回它們。

public

static 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 iteration

juan

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 iteration

juan

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 方法來轉換為集合方式,減少...