提出問題
下面所給**編譯時正常,但是執行時會出錯,請指出程式在執行時能夠執行到編號為(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序列中生成乙個元素,這個時候才會真正執行查詢操作.這就是所謂的 延遲...