LINQ中的 延遲查詢 特性

2021-09-07 22:25:51 字數 1365 閱讀 5285

很多標準查詢操作符的設計原型都是返回乙個ienumerable型別的序列, 這些標準查詢操作實際上不會在**執行到那一行的時候就返回乙個序列, 事實上返回的是乙個物件. 當在列舉(比如foreach)這個物件的時候會從ienumerable序列中生成乙個元素, 這個時候才會真正執行查詢操作. 這就是所謂的"延遲查詢".

int intarray = new int ;

ienumerableitems = intarray.select(i => i); //返回i

//輸出結果

foreach (int item in items)

console.writeline(item);

//更改一下intarray中的某個元素, 再進行"輸出結果"

intarray[0] = 4;

console.writeline("改變intarray第乙個元素值之後的輸出結果:");

//再次輸出結果

foreach (int item in items)

console.writeline(item);

兩次輸出結果分別為:0, 1, 2, 3 和 4, 1, 2, 3. 由此可見只有在列舉items的時候才會真正的執行查詢操作. 如果沒有延遲查詢, 兩次輸出的結果應該是相同的.

可以使用乙個不返回ienumerable資料型別的轉換操作符, 如toarray, tolist, todictionary或tolookup, 這樣查詢操作就不會被延遲了. 同樣是上面例子的, 通過tolist操作符返回乙個list型序列, 就不會產生"延遲查詢"的現象:

int intarray = new int ;

listitems = intarray.select(i => i).tolist(); //加了tolist操作符

//輸出結果

foreach (int item in items)

console.writeline(item);

//更改一下intarray中的某個元素, 再進行"輸出結果"

intarray[0] = 4;

console.writeline("改變intarray第乙個元素值之後的輸出結果:");

//再次輸出結果

foreach (int item in items)

console.writeline(item);

這樣兩次輸出的結果就都為0, 1, 2, 3了.

因為有了延遲, 被列舉的時候才會真正的去執行乙個查詢, 因此如果程式編譯通過了但絕對不意味著這個查詢就是沒事兒的. 比如查詢乙個字串陣列裡面, 每個元素的第3個字元是什麼的時候, 如果某個字串長度<3, 那麼在執行的時候就會報錯, 而程式在編譯的時候是沒有問題的.

LINQ延遲查詢

11.1.4 推遲查詢的執行 在執行期間定義查詢表示式時,查詢就不會執行,查詢會在迭代資料項時執行。比如說擴充套件方法where 它使用yield return語句返回謂詞為true的元素。因為使用了yield return語句,所以編譯器會建立乙個列舉器,在訪問列舉中的項後,就返回它們。publi...

延遲查詢 LINQ

1.linq查詢使用的是延遲查詢的方法,以便提高效率 1 public static ienumerablewhere this ienumerablesource,2 funcbool predicate 310 11 因為使用yield return,所以編譯器會建立乙個列舉器,在訪問列舉項後,...

Linq之延遲載入特性

寫在前面 系列文章 延遲載入 總結上篇文章介紹了linq中常見的幾個關鍵字,並列舉了幾個例子,算是對linq如何使用有了初步了解。上篇文章中也提到了,能夠使用linq的場合有乙個要求 實現ienumerable泛型介面,或者型別相容 可以通過cast方法轉換,比如arraylist linq之lam...