C# 中的"yield"使用
2016-03-15 14:48
417 查看
yield是C#为了简化遍历操作实现的语法糖,我们知道如果要要某个类型支持遍历就必须要实现系统接口IEnumerable,这个接口后续实现比较繁琐要写一大堆代码才能支持真正的遍历功能。举例说明
上面注释的部分引用了"yield return”,其功能相当于下面所有代码!可以看到如果不适用yield需要些很多代码来支持遍历操作。
yield return 表示在迭代中下一个迭代时返回的数据,除此之外还有yield break, 其表示跳出迭代,为了理解二者的区别我们看下面的例子
如果你只想让用户访问ARRAY的前8个数据,则可做如下修改.这时将会用到yield break,修改函数如下
这样,则只会返回前8个数据.
using System; using System.Collections.Generic; using System.Collections; using System.Linq; using System.Text; namespace{ class Program { static void Main(string[] args) { HelloCollection helloCollection = new HelloCollection(); foreach (string s in helloCollection) { Console.WriteLine(s); } Console.ReadKey(); } } //public class HelloCollection : IEnumerable //{ // public IEnumerator GetEnumerator() // { // yield return "Hello"; // yield return "World"; // } //} public class HelloCollection : IEnumerable { public IEnumerator GetEnumerator() { Enumerator enumerator = new Enumerator(0); return enumerator; } public class Enumerator : IEnumerator, IDisposable { private int state; private object current; public Enumerator(int state) { this.state = state; } public bool MoveNext() { switch (state) { case 0: current = "Hello"; state = 1; return true; case 1: current = "World"; state = 2; return true; case 2: break; } return false; } public void Reset() { throw new NotSupportedException(); } public object Current { get { return current; } } public void Dispose() { } } } }
上面注释的部分引用了"yield return”,其功能相当于下面所有代码!可以看到如果不适用yield需要些很多代码来支持遍历操作。
yield return 表示在迭代中下一个迭代时返回的数据,除此之外还有yield break, 其表示跳出迭代,为了理解二者的区别我们看下面的例子
class A : IEnumerable { private int[] array = new int[10]; public IEnumerator GetEnumerator() { for (int i = 0; i < 10; i++) { yield return array[i]; } } }
如果你只想让用户访问ARRAY的前8个数据,则可做如下修改.这时将会用到yield break,修改函数如下
public IEnumerator GetEnumerator() { for (int i = 0; i < 10; i++) { if (i < 8) { yield return array[i]; } else { yield break; } } }
这样,则只会返回前8个数据.
相关文章推荐
- C# 值类型与引用类型
- 【笔记】《C#大学教程》- 第10章 面向对象编程:多态性
- C#高级编程 (第六版) 学习 第三章:对象和类型
- Protected vs protected internal (Again) in c#
- C#通过Cookie记住登录信息
- C#第十五节课
- [Songqw.Net 基础]WPF实现简单的插件化开发
- C#中Array类
- C# IntPtr互转String
- [C#]Bencode编码算法/torrent文件解析
- C#中string.format用法详解
- Mongo C# 操作(元素 数组 )
- 开始使用NCrawler
- C# Panel控件截图
- C#中AS和IS关键字的用法
- 你的C#代码是怎么跑起来的(二)
- .Net C# Task异步调用功能一例
- C# Language Specification
- C#中关于as关键字的使用
- [Songqw.Net 基础]C#实现简单的插件化开发,可用于WPF Winform.