溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linq延時執(zhí)行怎么理解

發(fā)布時間:2021-12-01 16:16:55 來源:億速云 閱讀:120 作者:iii 欄目:編程語言

本篇內(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í)!

向AI問一下細(xì)節(jié)

免責(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)容。

AI