您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Linq延時執(zhí)行怎么理解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Linq延時執(zhí)行怎么理解”吧!
Linq的大多數(shù)查詢運算符的一個重要特性就是,他們并不是在構(gòu)建的時候就立即執(zhí)行,而是在枚舉是執(zhí)行,換句話說,當(dāng)枚舉變量調(diào)用MoveNext時執(zhí)行。
在構(gòu)建查詢之后,另外插入到列表中的數(shù)字也會包含在結(jié)構(gòu)中,因為直到foreach運行時此才回進(jìn)行篩選或者是排序操作,稱之為延時執(zhí)行或延緩計算,所有標(biāo)準(zhǔn)查詢運算符均為延時執(zhí)行,但是有的運算符不支持延時執(zhí)行的機(jī)制,而是立即執(zhí)行,如Count 、ToAarry、toLookup等。
Linq延時執(zhí)行還有一點不好的影響,如果查詢的lambda表達(dá)式引用了局部變量,那么這些便來那個會受到外部便來那個語義的約束。
當(dāng)在foreach循環(huán)中構(gòu)建查詢時,這就會成為一個陷阱,例如假定想要刪除字符串中的所有元音字母。如下所示的雖然效率不高,但是能得到正確的結(jié)果:
IEnumberable<int> qurey ="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) Console.Write(c); //Nt wht y mght xpct
上面的代碼是可以得到正確的結(jié)果,那么現(xiàn)在如果用foreach循環(huán)重寫這段代碼能否的道正確的結(jié)果:
IEnumerable<char> 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循環(huán)翻譯成如下的代碼: IEnumerable<char> vowels="aeiou"; Iemuberator<char> rator=vowels.GetEnumerator(); char vowel; while(rator.MoveNext()) { vowel =rator.Current; queryquery =query.Where(c=>c!=vowel); }
因為vowel變量時循環(huán)外部聲明的,同一個變量重復(fù)聲明更新,所以每個lambda表達(dá)式獲取的是同樣的vowel.之后枚舉查詢時,所有的lambda表達(dá)式引用了這個變量的當(dāng)前值,即'u'。為了解決這個問題,必須將循環(huán)變量賦值被另一再循環(huán)代碼塊內(nèi)聲明的變量:
IEnumberable<int> qurey ="Not what you might expect"; foreach( char vowel in "aeiou") { char temp =vowel; queryquery =query.Where(c=>c!=temp); }
到此,相信大家對“Linq延時執(zhí)行怎么理解”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。