技术开发 频道

.Net编程接口剖析系列之迭代器

    
    我们再来看看迭代器类型struct Emurator的定义,它是嵌套在List2D之中的,它实现了IEnumerator<T>接口。迭代器的实现详见注释。
class List2D<T> : IEnumerable<T> 
{
public struct Emurator : IEnumerator<T>
{
List2D<T> _list2D; //被枚举的2D list
IEnumerator<List<T>> _listsEmuretor; //列表迭代器
IEnumerator<T> _listEmuretor; //元素迭代器
bool _started; //是否开始枚举
T _current; //当前元素

public Emurator(List2D<T> list2D)
{
_list2D=list2D;
_listsEmuretor = list2D._lists.GetEnumerator();
_listEmuretor=default(IEnumerator<T>);
_started = false;
_current = default(T);
}

#region IEnumerator Members

public object Current
{
get { return _current; }
}

public bool MoveNext()
{
if (!_started) //第一次MoveNext, 需要取第一个列表
{
_started = true;
if (!_listsEmuretor.MoveNext())
return false;

_listEmuretor = _listsEmuretor.Current.GetEnumerator(); //获取第一个list的迭代器
}

while(true)
{
if (!_listEmuretor.MoveNext())
{
//当前列表枚举结束,需要移动到一个列表
if (!_listsEmuretor.MoveNext())
return false; //所有列表遍历完毕,返回false

_listEmuretor = _listsEmuretor.Current.GetEnumerator();
}
else //当前列表还有元素,成功
{
_current = _listEmuretor.Current;
return true;
}
}
}

public void Reset()
{
_listsEmuretor.Reset();
_current = default(T);
_started = false;
}
#endregion

#region IEnumerator<T> Members
T IEnumerator<T>.Current
{
get { return _current; }
}
#endregion

public void Dispose()
{
}
}
}
    真不容易,写了好些代码才把这个2D List的迭代器实现。我们在Main函数里面写一些测试代码,看看它能否正常运行。

static void Main(string[] args) 
{
List2D<string> list2D = new List2D<string>();//2维string列表

List<string> list1 = new List<string>();
list1.Add("list1-1");
list1.Add("list1-2");
list1.Add("list1-3");
list2D.Add(list1); //第一个列表有3个元素

List<string> list2 = new List<string>();
list2D.Add(list2);//第二个列表没有元素

List<string> list3 = new List<string>();
list1.Add("list3-1");
list1.Add("list3-2");
list2D.Add(list3); //第三个列表有2个元素

foreach (string str in list2D)//枚举所有string
{
Console.WriteLine(str);
}

Console.ReadKey();
   运行结果如下。
   list1-1
   list1-2
   list1-3
   list3-1
   list3-2
   我们可以看到运行结果完全正确。
0
相关文章