C 中Linq延遲查詢的例子

2022-10-07 02:21:08 字數 1065 閱讀 2150

提出問題

下面所給**編譯時正常,但是執行時會出錯,請指出程式在執行時能夠執行到編號為(1)(2)(3)的**行中的哪一行。

using system;

using system.collections.generic;

usi程式設計客棧ng system.linq;

namespace deferredexecutionexp

, new student(),

new student()

};var queryedstudentlist = studentlist.where(it => it.name.trim() != "zhanwww.cppcns.comgsan");//(1)

if (queryedstudentlist.count() > 0)//(2)}}

} public class student

public string name

public int age

}}問題分析

其實,發現問題並不難,很顯然在執行**「it => it.name.trim()」時會出錯,因為集合studentlist中第二個學生的name屬性為null,當遍歷到該學生時,對其name屬性執行trim操作,不出錯才怪呢。既然在這裡會出錯,那麼程式肯定是執行到該行就gameover了呀。但是實際情況又會是這樣嗎?

動手驗證

單步除錯程式,發現:執行到**行(1)時,程式並沒有出錯,而是在執行**行(2)時,程式才出現了異常,檢視異常資訊,卻提示的是在執行**行(1)時有問題,為什麼會這樣呢?為什麼執行到**行(2)時還會去執行**行(1)呢?這全都是因為linq的延遲查詢導致的。

延遲查詢

延遲查詢的意思是說:在執行期間定義查詢表示式時,查詢不會執行,只有到迭代資料項時查詢才會被執行。本例中的**行(1)只是定義了查詢,而**行(2)中當呼叫count方法時便會遍歷資料項,這時程式設計客棧便會執行查詢,也就是說會去執行**行(1)定義的查詢,最終導致了本例中這種現象的出現。

所以,本例中的**最終能夠執行到的**行是(2)。

本文標題: c#中linq延遲查詢的例子

本文位址:

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中的 延遲查詢 特性

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