CSharp中迭代器yield-return用法
迭代器方法
迭代器方法有一个重要限制:在同一方法中不能同时使用 return 语句和 yield return 语句。
此限制通常不是问题。 可以选择在整个方法中使用 yield return,或选择将原始方法分成多个方法,一些使用 return,另一些使用 yield return。
使用 yield return 上下文关键字定义迭代器方法。
yield关键字用于遍历循环中,yield return
用于返回IEnumerable<T>
;yield break
用于终止循环遍历。
简单理解
1 | public static bool onOff = false; |
实例
以下int类型的集合,需要打印出所有值大于2的元素。
1 | static List<int> GetInitialData() |
不使用yield return的实现
1 | static IEnumerable<int> FilterWithoutYield() |
客户端调用:
1 | foreach (var item in FilterWithoutYield()) |
结果:3,4
使用yeild return实现
1 | static IEnumerable<int> FilterWithYield() |
1 | foreach (var item in FilterWithYield()) |
结果:3,4
总结
第一种方法(不使用yield),是把结果集全部加载到内存中再遍历;
第二种方法(使用yield),客户端每调用一次,yield return就返回一个值给客户端,是”按需供给”。
使用yield return为什么能保证每次循环遍历的时候从前一次停止的地方开始执行呢?
–因为,编译器会生成一个状态机来维护迭代器的状态。
简单地说,当希望获取一个IEnumerable<T>
类型的集合,而不想把数据一次性加载到内存,就可以考虑使用yield return实现”按需供给”。
参考: