码迷,mamicode.com
首页 > Windows程序 > 详细

C#中yield return用法

时间:2016-03-19 16:03:42      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:

1.yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历

不使用yield return的实现

  1. static IEnumerable<int> FilterWithoutYield()
  2. {
  3. List<int> result = new List<int>();
  4. foreach (int i in GetInitialData())
  5. {
  6. if (i > 2)
  7. {
  8. result.Add(i); //这里的add就把结果都给了result,返回一个List<int>类型的result对象,所以这里返回的结果result是List<int>类型,会转化为IEnumerable<int>类型
  9. }
  10. }
  11. return result;
  12. }
使用yeild return实现
  1. static IEnumerable<int> FilterWithYield()
  2. {
  3. foreach (int i in GetInitialData())
  4. {
  5. if (i > 2)
  6. {
  7. yield return i;
  8. }
  9. }
  10. yield break;
  11. Console.WriteLine("这里的代码不执行");
  12. }
客户端调用的代码是相同的
  1. static void Main(string[] args)
  2. {
  3. foreach (var item in FilterWithYield())
  4. {
  5. Console.WriteLine(item);
  6. }
  7. Console.ReadKey();
  8. }
使用这个代码测试LINQ表达式,结果发现:方法的类不是IEnumerable<T>类型,只有方法的返回值是IEnumerable<T>,所以只能对方法的返回值使用LINQ
所以使用LINQ就有两个条件:
1.对类来说,这个类继承了IEnumerable<T>,就要实现IEnumerator GetNumerator方法
2.对方法来说,这个方法返回了IEnumerable<T>接口的类型
虽然2种方法的输出结果是一样的,但运作过程迥然不同。第一种方法,是把结果集全部加载到内存中再遍历;第二种方法,客户端每调用一次,yield return就返回一个值给客户端,是"按需供给"。

第一种方法,客户端调用过程大致为:

技术分享

使用yield return,客户端调用过程大致为:

技术分享

使用yield return为什么能保证每次循环遍历的时候从前一次停止的地方开始执行呢?

--因为,编译器会生成一个状态机来维护迭代器的状态。

简单地说,当希望获取一个IEnumerable<T>类型的集合,而不想把数据一次性加载到内存,就可以考虑使用yield return实现"按需供给"。



实现一个IEnumerable接口的代码

  1. public class Stack : IEnumerable
  2. {
  3. int[] items = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  4. public IEnumerator GetEnumerator()
  5. {
  6. for (int i = 0; i < items.Length; i++)
  7. {
  8. yield return items[i]; // return返回的是IEnumerator集合对象,也就是说类中本身就有了一个
  9. //IEnumerator对象,Foreach遍历的时候,也遍历的是这个IEnumerator对象,所以直接写foreach(var i in ss)就可以了,底层帮助完成其他代码
  10. }
  11. }
  12. }





 




C#中yield return用法

标签:

原文地址:http://www.cnblogs.com/weloveshare/p/5295128.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!