Linq延時執行

2022-03-11 21:42:27 字數 1541 閱讀 6346

本文向大家介紹linq延時執行,可能好多人還不了解linq延時執行,沒有關係,看完本文你肯定有不少收穫,希望本文能教會你更多東西。

linq的大多數查詢運算子的乙個重要特性就是,他們並不是在構建的時候就立即執行,而是在列舉是執行,換句話說,當列舉變數呼叫movenext時執行。

在構建查詢之後,另外插入到列表中的數字也會包含在結構中,因為直到foreach執行時此才回進行篩選或者是排序操作,稱之為延時執行或延緩計算,所有標準查詢運算子均為延時執行,但是有的運算子不支援延時執行的機制,而是立即執行,如count 、toaarry、tolookup等。

linq延時執行還有一點不好的影響,如果查詢的lambda表示式引用了區域性變數,那麼這些便來那個會受到外部便來那個語義的約束。

當在foreach迴圈中構建查詢時,這就會成為乙個陷阱,例如假定想要刪除字串中的所有母音字母。如下所示的雖然效率不高,但是能得到正確的結果:

ienumberablequrey ="not what you might expect"; 

queryquery =query.where(c=>c!='a');

queryquery =query.where(c=>c!='e');

queryquery =query.where(c=>c!='i');

queryquery =query.where(c=>c!='o');

queryquery =query.where(c=>c!='u');

foreach(char c in query)

上面的**是可以得到正確的結果,那麼現在如果用foreach迴圈重寫這段**能否的道正確的結果:

ienumerable query ="

not what you might expect

"; foreach(cha vowel in

"aeiou

") qwuer =query.where(c=>c!=vowel); foreach(char c in query) console.write(c); //

not what yo might expect

//只刪除了'u',這是因為編譯器將foreach迴圈翻譯成如下的**: ienumerablevowels="aeiou"; iemuberatorrator=vowels.getenumerator(); char vowel; while(rator.movenext())

因為vowel變數時迴圈外部宣告的,同乙個變數重複宣告更新,所以每個lambda表示式獲取的是同樣的vowel.之後列舉查詢時,所有的lambda表示式引用了這個變數的當前值,即'u'。為了解決這個問題,必須將迴圈變數賦值被另一再迴圈**塊內宣告的變數:

ienumberable qurey ="

not what you might expect

"; foreach( char vowel in

"aeiou

")

這樣每次迴圈迭代守使用新的變數,以上介紹linq延時執行。

sql waitfor 延時執行

看msdn 語法為 waitfor 以下示例在晚上 10 20 22 20 執行儲存過程sp update job。datetime value is not allowed.不能指定日期 waitfor time 22 20 execute sp update job 以下示例在兩小時的延遲後執行...

執行緒池 任務延時執行

我在做乙個匯入功能,匯入的邏輯都是呼叫的頁面介面。介面執行邏輯 將資料儲存到資料庫,然後再呼叫job任務加工歷史資料。使用者在頁面上操作是ok的,畢竟每操作一下,介面最多呼叫一次。但是匯入就不一樣了,相當於使用者一直在對著頁面點點點 這會導致後面歷史任務的加工出現問題。在匯入的時候,我需要先讓基本資...

重新延時執行的Js 實現

1.autocomplete 外掛程式,當使用者的輸入空閒0.5s 時,才向服務傳送請求。而不是使用者輸入每乙個字元都要請求伺服器。2.懶載入時,使用者拖動滾動條空閒0.5s時,才遍歷懶載入的img元素,這樣操作比較平滑。對每乙個操作,定義乙個唯一操作碼,重新延時執行時,清空該操作碼的執行體。重新定...