C#中,什么时候用yield return
yield關(guān)鍵字用于遍歷循環(huán)中,yield return用于返回IEnumerable<T>,yield break用于終止循環(huán)遍歷。
?
有這樣的一個int類型的集合:
static List<int> GetInitialData(){return new List<int>(){1,2,3,4};}需要打印出所有值大于2的元素。
?
? 不使用yield return的實(shí)現(xiàn)
static IEnumerable<int> FilterWithoutYield(){List<int> result = new List<int>();foreach (int i in GetInitialData()){if (i > 2){result.Add(i);} }return result;}客戶端調(diào)用:
static void Main(string[] args){foreach (var item in FilterWithoutYield()){Console.WriteLine(item);}Console.ReadKey(); }輸出結(jié)果:3,4
?
? 使用yeild return實(shí)現(xiàn)
static IEnumerable<int> FilterWithYield(){foreach (int i in GetInitialData()){if (i > 2){yield return i;}}yield break;Console.WriteLine("這里的代碼不執(zhí)行");}客戶端調(diào)用:
static void Main(string[] args){foreach (var item in FilterWithYield()){Console.WriteLine(item);}Console.ReadKey(); }輸出結(jié)果:3,4
?
? 總結(jié)
通過單步調(diào)試發(fā)現(xiàn):
雖然2種方法的輸出結(jié)果是一樣的,但運(yùn)作過程迥然不同。第一種方法,是把結(jié)果集全部加載到內(nèi)存中再遍歷;第二種方法,客戶端每調(diào)用一次,yield return就返回一個值給客戶端,是"按需供給"。
第一種方法,客戶端調(diào)用過程大致為:
?
使用yield return,客戶端調(diào)用過程大致為:
?
使用yield return為什么能保證每次循環(huán)遍歷的時候從前一次停止的地方開始執(zhí)行呢?
--因?yàn)?#xff0c;編譯器會生成一個狀態(tài)機(jī)來維護(hù)迭代器的狀態(tài)。
?
簡單地說,當(dāng)希望獲取一個IEnumerable<T>類型的集合,而不想把數(shù)據(jù)一次性加載到內(nèi)存,就可以考慮使用yield return實(shí)現(xiàn)"按需供給"。
轉(zhuǎn)載于:https://www.cnblogs.com/darrenji/p/3832857.html
總結(jié)
以上是生活随笔為你收集整理的C#中,什么时候用yield return的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: T-SQL Recipes之Custom
- 下一篇: ASP.NET Web API中展示实体