本文实例讲述了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