当前位置: 首页 > 编程笔记 >

C#中yield return用法分析

太叔岳
2023-03-14
本文向大家介绍C#中yield return用法分析,包括了C#中yield return用法分析的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了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种方法的输出结果是一样的,但运作过程迥然不同。第一种方法,是把结果集全部加载到内存中再html" target="_blank">遍历;第二种方法,客户端每调用一次,yield return就返回一个值给客户端,是"按需供给"。

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

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

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

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

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

希望本文所述对大家的C#程序设计有所帮助。

 类似资料:
  • 本文向大家介绍C#中Activator.CreateInstance()方法用法分析,包括了C#中Activator.CreateInstance()方法用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中Activator.CreateInstance()方法用法。分享给大家供大家参考。具体分析如下: Activator 类 包含特定的方法,用以在本地或从远程创建对象类型,或获

  • 本文向大家介绍C#中的集合用法分析,包括了C#中的集合用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中的集合用法,分享给大家供大家参考。具体分析如下: 【集合不同于数组,是一组可变类型的、可变数量的元素的组合,这些元素可能共享某些特征,需要以某种操作方式一起进行操作。一般来讲,为了便于操作这些元素的类型是相同的】 【集合与数组的区别:数组是连续的、同一类型数据的一块区域,而集

  • 本文向大家介绍c#中Empty()和DefalutIfEmpty()用法分析,包括了c#中Empty()和DefalutIfEmpty()用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了c#中Empty()和DefalutIfEmpty()用法。分享给大家供大家参考。具体分析如下: 在项目中,当我们想获取IEnumerable<T>集合的时候,这个集合有可能是null。但通常的做法

  • 本文向大家介绍C#类中static变量用法分析,包括了C#类中static变量用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#类中static变量用法。分享给大家供大家参考。具体分析如下: 先来看一段代码: 上面的代码是一个网友告诉我的,让我看看结果,我看了一眼马上说结果是 i=1 j=1 网友运行后说结果是 i=0 j=1 我吓了一跳,认真看了代码,原来自己真的错了。 下面我

  • 本文向大家介绍C#中的try catch finally用法分析,包括了C#中的try catch finally用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中的try catch finally用法。分享给大家供大家参考。具体分析如下: try中的程序块是有可能发生错误的程序块,catch中的程序块是当发生错误的时候才会执行的代码块,finally中的程序块是无论是否发生

  • 本文向大家介绍C#中OpenFileDialog和PictrueBox的用法分析,包括了C#中OpenFileDialog和PictrueBox的用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中OpenFileDialog和PictrueBox的用法。分享给大家供大家参考。具体用法分析如下: 先来看看这段代码: resultFile 就能得到你选中文件的路径 OpenFile