国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#中yield return用法分析

2020-01-24 02:26:54
字體:
來源:轉載
供稿:網友

本文實例講述了C#中yield return用法,并且對比了使用yield return與不使用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實現"按需供給"。

希望本文所述對大家的C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永平县| 息烽县| 荣成市| 青铜峡市| 武胜县| 广宗县| 江山市| 扎囊县| 丁青县| 太仆寺旗| 望奎县| 杭州市| 绵阳市| 开封县| 黄浦区| 高雄县| 天峻县| 乌拉特前旗| 大埔县| 莱州市| 桓仁| 宾阳县| 岐山县| 乌拉特中旗| 江安县| 牟定县| 周宁县| 涞水县| 望都县| 新民市| 安多县| 南阳市| 黑河市| 克东县| 文成县| 海原县| 本溪| 河北区| 乐陵市| 武城县| 正镶白旗|