黑马程序员_迭代器
来源:互联网 发布:电子病历系统源码 编辑:程序博客网 时间:2024/06/06 01:55
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
迭代器被用来遍历聚合结构(相当于数据集合),是一种方法、get 访问器或运算符,它通过使用 yield 关键字对聚合结构执行自定义迭代。Yield 是一组循环语句用以返回当前值和跳转下一次循环。
一般通过使用foreach 语句调用迭代器,而 foreach 要求遍历的结构是枚举器或可枚举类型,从而需要实现枚举器接口(IEnumerator)或可枚举接口(IEnumerable)。接口中包含 foreach 必须的 GetEnumerator、MoveNet、Reset 和 Current 成员,但在编程时一般只需实现GetEnumerator 成员,按照官方的说法是当编译器检测到迭代器时,它将自动生成Current、MoveNext 和Current 方法。
以下分别介绍4种实现迭代器的方法。
1 foreach 迭代
示例取自 msdn,是使用 foreach 遍历字符串数组。
using System;public class SplitTest{ public static void Main() { string words = "This is a list of words, with: a bit of punctuation" + "\tand a tab character."; string[] split = words.Split(new Char[] { ' ', ',', '.', ':', '\t' }); foreach (string s in split) { if (s.Trim() != "") Console.WriteLine(s); } }}
字符串数组自身实现了上述接口,因而可以直接使用 foreach 语句遍历,如果在自定义类型中,使用该种方法,则需全部实现 GetEnumerator、MoveNet、Reset 和 Current 成员。
2 匿名迭代器
在使用匿名迭代器时,只需要实现 GetEnumerator成员,实力取自《c# 自学手册》,其使用了 yield 返回迭代值。
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 匿名迭代{ class MyIterator { private static int Max = 10; public IEnumerator<int> GetEnumerator() { for (int i = 0; i < Max; i++) { yield return i; } } } class Program { static void Main(string[] args) { //创建对面 MyIterator iterator = new MyIterator(); foreach (int i in iterator) { Console.Write(i + " "); } Console.WriteLine(); } }}
3 命名迭代器
命名迭代器是以满足特定需要,对应创建的迭代器。相应的其可以有参数列表(签名),用以控制迭代的步长或次数等。下面是一个于特定开始和结束的命名迭代器。using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Collections;namespace 命名迭代器{ class MyIterator { public IEnumerable MyEnumerator(int s, int e) { for (int i = s; i < e; i++) { yield return i; } } } class Program { static void Main(string[] args) { //创建对面 MyIterator iterator = new MyIterator(); foreach (int i in iterator.MyEnumerator(1, 9)) { Console.Write(i + " "); } Console.WriteLine(); } }}
4 get 访问迭代器
下面使用get 访问迭代器输出“nihao!”,其中由 yield return 返回值,yield break 终止迭代。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Collections;namespace get_iterator{ class MyIterator { public IEnumerable MyEnAttribute { get { yield return "ni"; yield return "hao!"; yield break; } } } class Program { static void Main(string[] args) { // MyIterator iterator = new MyIterator(); foreach (string s in iterator.MyEnAttribute) { Console.Write(s + " "); } Console.WriteLine(); } }}
综上所述,迭代器有以下优点,对聚合结构的遍历,但不需显示结构的内部构成;使用迭代器从而使得遍历与结构分离,符合面向对面的思想;上述方法几何对所有有需要的聚合结构都能使用,且非常方便,由此其实用性非常强。
5 参考
迭代器(C# 编程指南)---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
- 黑马程序员_迭代器
- 黑马程序员_集合类_迭代器
- 黑马程序员_集合与迭代器
- 黑马程序员_枚举
- 黑马程序员_多线程
- 黑马程序员_反射
- 黑马程序员_泛型
- 黑马程序员_注解
- 黑马程序员_注解
- 黑马程序员_泛型
- 黑马程序员_代理
- 黑马程序员_继承
- 黑马程序员_多态
- 黑马程序员_线程
- 黑马程序员_泛型
- 黑马程序员_反射
- 黑马程序员_泛型
- 黑马程序员_反射
- 商业WIKI程序 Confluence
- 【QQ互联】【解决】client request's parameters are invalid, invalid openid
- 所有基础问题写到这里
- ComboBox实现显示文本与值不同的方法
- 对进程地址空间的一点认识
- 黑马程序员_迭代器
- linux 下启动级别命令
- HDU 4507 吉哥系列故事——恨7不成妻(数位DP)
- Confluence 4.0 功能亮点
- 百度开源项目聚合,百度开源平台
- struts中Action类的国际化
- HDU-2007 Scrambled Polygon 极角排序
- 使用TDBChart显示InterBase数据库的一行数据
- 七牛云存储,不再为网站空间担心