c#设计模式-行为性模式-3.迭代器模式
Posted mr.chenyuelin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#设计模式-行为性模式-3.迭代器模式相关的知识,希望对你有一定的参考价值。
迭代器模式的实现:提供一种方法顺序访问1个聚合对象(类)的各个元素,而不暴露内部的表示
先看下数组的遍历:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 迭代器模式
{
class Program
{
static void Main(string[] args)
{
int[] arr = { 2, 3, 5, 5 };
IEnumerator ie = arr.GetEnumerator();
foreach (int item in arr)
{
Console.WriteLine(item);
}
//内部迭代器实现过程
int[] arr1 = { 2, 3, 5, 5 };
IEnumerator ie2 = arr.GetEnumerator();
while(ie2.MoveNext())
{
int i = (int)ie2.Current;
Console.WriteLine(i);
}
Console.ReadKey();
}
}
}
为什么数组能够通过foreach遍历呢?原因是数组实现了IEnumerable接口,IEumerable接口中只有一个成员方法:GetEnumerator(),这个方法返回一个枚举器对象,这个枚举器就是迭代器模式中的迭代器。我们可以通过GetEnumerator方法获取枚举器对象。那么什么是枚举器呢?实现IEnumerator接口的类型就是枚举器,该接口有三个成员:
current :获取当前位置元素
MoveNext() :把枚举器位置前进到下一项,返回bool,表示位置是否有效
Reset() :把位置重置为原始状态的位置(有索引是一般为-1)
我们就可以自己实现一个可以用foreach遍历的类了:自定义的类要实现IEnumerable接口的GetEnumerator方法,这个方法返回一个枚举器(就是一个继承IEnumerator接口的类型),以遍历自定义颜色集合为例,代码如下:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 迭代器模式
{
class ColorList : IEnumerable
{
//实现IEnumerable的接口
public IEnumerator GetEnumerator()
{
return new ColorEnumerator(new string[] { "red", "green", "pink" });
}
}
class ColorEnumerator : IEnumerator
{
private string[] colors;
private int index = -1;
public ColorEnumerator(string[] v)
{
this.colors = new string[v.Length];
for (int i = 0; i < colors.Length; i++)
{
colors[i] = v[i];
}
}
//获取当前的值
public object Current
{
get
{
if (index < 0 || index > colors.Length - 1)
{
throw new Exception("数组越界");
}
return colors[index];
}
}
//指向下一个
public bool MoveNext()
{
if(index<colors.Length - 1)
{
index++;
return true;
}
return false;
}
//重置
public void Reset()
{
index = -1;
}
}
class Program
{
static void Main(string[] args)
{
ColorList colorList = new ColorList();
//遍历自定义类
foreach (var item in colorList)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}
}
理解上面之后,我们使用迭代器时,不用我们自己去手动创建IEnumerator实例,编译器会自动帮我们生成IEnumerator内部的Current,MoveNext和Reset方法。使用迭代器上边的例子可以简化为:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 迭代器模式
{
class ColorList : IEnumerable
{
//实现IEnumerable的接口
public IEnumerator GetEnumerator()
{
//return new ColorEnumerator(new string[] { "red", "green", "pink" });
string[] colors = { "red", "green", "pink" };
for (int i = 0; i < colors.Length; i++)
{
yield return colors[i];
}
}
}
class Program
{
static void Main(string[] args)
{
ColorList colorList = new ColorList();
//遍历自定义类
foreach (var item in colorList)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}
}
简单记忆:迭代器模式就是实现自定义类的遍历
以上是关于c#设计模式-行为性模式-3.迭代器模式的主要内容,如果未能解决你的问题,请参考以下文章