马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

C#中yield return用法讲解

[复制链接]
查看5203 | 回复2 | 2016-7-14 09:37:31 | 显示全部楼层 |阅读模式
本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解。具体如下:
yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历。
有这样的一个int类型的集合:

[C#] 纯文本查看 复制代码
static List<int> GetInitialData()
{
  return new List<int>(){1,2,3,4};
}


需要打印出所有值大于2的元素。
不使用yield return的实现
[C#] 纯文本查看 复制代码
static IEnumerable<int> FilterWithoutYield()
{
  List<int> result = new List<int>();
  foreach (int i in GetInitialData())
  {
 if (i > 2)
 {
   result.Add(i);
 } 
  }
  return result;
}

客户端调用:
[C#] 纯文本查看 复制代码
static void Main(string[] args)
{
  foreach (var item in FilterWithoutYield())
  {
 Console.WriteLine(item);
  }
  Console.ReadKey(); 
}

输出结果:3,4
使用yeild return实现
[C#] 纯文本查看 复制代码
static IEnumerable<int> FilterWithYield()
{
  foreach (int i in GetInitialData())
  {
 if (i > 2)
 {
   yield return i;
 }
  }
  yield break;
  Console.WriteLine("这里的代码不执行");
}

客户端调用:
[C#] 纯文本查看 复制代码
static void Main(string[] args)
{
  foreach (var item in FilterWithYield())
  {
 Console.WriteLine(item);
  }
  Console.ReadKey(); 
}

输出结果:3,4
总结:
通过单步调试发现:
虽然2种方法的输出结果是一样的,但运作过程迥然不同。第一种方法,是把结果集全部加载到内存中再遍历;第二种方法,客户端每调用一次,yield return就返回一个值给客户端,是"按需供给"。

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

C#中yield return用法讲解,IBC编程社区,www.ibcibc.com,C#教程

C#中yield return用法讲解,IBC编程社区,www.ibcibc.com,C#教程

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

C#中yield return用法讲解,IBC编程社区,www.ibcibc.com,C#教程

C#中yield return用法讲解,IBC编程社区,www.ibcibc.com,C#教程

使用yield return为什么能保证每次循环遍历的时候从前一次停止的地方开始执行呢?
--因为,编译器会生成一个状态机来维护迭代器的状态。

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

C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
ibcadmin | 2016-7-14 09:48:23 | 显示全部楼层
回复是美德
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
剑弑 | 2016-7-14 10:07:54 | 显示全部楼层
研究研究
您需要登录后才可以回帖 登录 | 立即注册

*滑块验证:
img_loading
智能检测中
本版积分规则