日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

C#中,什么时候用yield return

發布時間:2025/3/15 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#中,什么时候用yield return 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

yield關鍵字用于遍歷循環中,yield return用于返回IEnumerable<T>,yield break用于終止循環遍歷。

?

有這樣的一個int類型的集合:

static List<int> GetInitialData(){return new List<int>(){1,2,3,4};}

需要打印出所有值大于2的元素。

?

? 不使用yield return的實現

static IEnumerable<int> FilterWithoutYield(){List<int> result = new List<int>();foreach (int i in GetInitialData()){if (i > 2){result.Add(i);} }return result;}

客戶端調用:

static void Main(string[] args){foreach (var item in FilterWithoutYield()){Console.WriteLine(item);}Console.ReadKey(); }

輸出結果:3,4

?

? 使用yeild return實現

static IEnumerable<int> FilterWithYield(){foreach (int i in GetInitialData()){if (i > 2){yield return i;}}yield break;Console.WriteLine("這里的代碼不執行");}

客戶端調用:

static void Main(string[] args){foreach (var item in FilterWithYield()){Console.WriteLine(item);}Console.ReadKey(); }

輸出結果:3,4

?

? 總結

通過單步調試發現:

雖然2種方法的輸出結果是一樣的,但運作過程迥然不同。第一種方法,是把結果集全部加載到內存中再遍歷;第二種方法,客戶端每調用一次,yield return就返回一個值給客戶端,是"按需供給"。


第一種方法,客戶端調用過程大致為:

?

使用yield return,客戶端調用過程大致為:

?

使用yield return為什么能保證每次循環遍歷的時候從前一次停止的地方開始執行呢?

--因為,編譯器會生成一個狀態機來維護迭代器的狀態。

?

簡單地說,當希望獲取一個IEnumerable<T>類型的集合,而不想把數據一次性加載到內存,就可以考慮使用yield return實現"按需供給"。

轉載于:https://www.cnblogs.com/darrenji/p/3832857.html

總結

以上是生活随笔為你收集整理的C#中,什么时候用yield return的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。