-
C#教程之C#迭代器模式(Iterator Pattern)实例教程
本文以实例形式简单简述了C#迭代器模式的实现方法,分享给大家供大家参考。具体方法如下:
一般来说,迭代器模式的需求来自:需要对一些集合进行迭代,而迭代的方式可能有很多种。
说到迭代,动作大致包括设置第一个位置,获取下一个位置元素,判断是否迭代结束,获取当前位置元素,大致就这么些。把这些迭代动作封装到一个接口中。
1
2
3
4
5
6
7
|
public interface IIterator { void First(); string Next(); bool IsDone(); string Current(); } |
在现实场景中,迭代的方式可能有很多种,先实现一种迭代方式,实现IIterator接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public class IWannaIterate : IIterator { private List< string > _list; private int position; public IWannaIterate(List< string > list) { Console.WriteLine( "我要感谢IIterator,有了它我才可以迭代" ); _list = list; position = 0; } public void First() { position = 0; } public string Next() { return _list[position++]; } public bool IsDone() { return position >= _list.Count; } public string Current() { return _list[position]; } } |
以上,迭代器IWannaIterate类内部维护这一个集合,而这个集合是通过构造函数赋值的,否则的话,迭代器就没活干了。
好了,迭代器,迭代的具体方式有了,迭代器给谁用呢?
只要一个类维护着集合,就可能用到以上实现IIterator接口的某种具体迭代器。所有需要迭代器的类都有一个共同的动作,就是创建一个迭代器。先把创建迭代器的动作抽象成接口。
1
2
3
4
|
public interface IManagement { IIterator CreateIterator(); } |
假设有一个管理用户集合的类,使用以上的IWannaIterate迭代器。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class MyUserManagement : IManagement { private List< string > _users; public MyUserManagement() { _users = new List< string >(); _users.Add( "hello" ); _users.Add( "world" ); _users.Add( "nice" ); } public IIterator CreateIterator() { return new IWannaIterate(_users); } } |
假设有一个管理Book集合的类,也使用以上的IWannaIterate迭代器。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class MyBookManagement : IManagement { private List< string > _books; public MyBookManagement() { _books = new List< string >(); _books.Add( "美丽世界" ); _books.Add( "你好吗" ); } public IIterator CreateIterator() { return new IWannaIterate(_books); } } |
客户端让MyUserManagement和MyBookManagement创建各自的迭代器,然后使用迭代器把集合的所有元素打印出来。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class Program { static void Main( string [] args) { IManagement magageA = new MyUserManagement(); IManagement manageB = new MyBookManagement(); IIterator iteratorA = magageA.CreateIterator(); IIterator iteratorB = manageB.CreateIterator(); Console.WriteLine( "打印出的user列表" ); PrintList(iteratorA); Console.WriteLine(); Console.WriteLine( "打印出book列表" ); PrintList(iteratorB); Console.ReadKey(); } private static void PrintList(IIterator iterator) { while (!iterator.IsDone()) { Console.WriteLine(iterator.Next()); } } } |
运行结果如下图所示:
希望本文所述对大家的C#程序设计有所帮助。
栏目列表
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比