Farseer

导航

C#2.0学习笔记--迭代器

1.why Iterators
C#中的foreach语句用于迭代一个可枚举集合的元素.为了实现可枚举,这个集合元素必须实现无参的GetEnumerator 方法,该方法返回一个enumerator,通常情况下enumerator实现起来是比较困难的,用Iterators让这个任务变得非常简单.
2.How Iterators
一个iterator 是yields一个有序值序列的语句块.一个iterator 不同于其他语句块的地方在于它有一个或多个yield语句
a. yield return 语句用于产生迭代的下一个值
b.yield break语句表示迭代完成.
一个iterator 可以用做一个函数的函数体,只要这个函数的返回值类型是enumerator interfaces 或者enumerable interfaces.
a.enumerator interfaces 是System.Collections.IEnumerator 或者是范型System.Collections.Generic.IEnumerator<T>的构造类型.
b.enumerable interfaces是System.Collections.IEnumerable 或者是范型System.Collections.Generic.IEnumerable<T>的构造类型.
理解一下一点是非常重要的:iterator 不是一个成员而是实现函数成员的手段.一个通过iterator 实现的方法,可以被其他成员overridden或者overloaded(这不知道这两个单词怎么翻译了,很多翻译都把这两个单词处理为重载,这是不太欠当的,因为两者不是一回事,直接用E文好了),那些成员可以用iterator 实现也可以不用iterator 实现.
下面的例子是Stack<T>用iterator实现它的Enumerator.iterator从栈顶到栈底枚举栈中的元素
using System.Collections.Generic;

public class Stack<T>: IEnumerable<T>

{

    T[] items;

    
int count;

    
public void Push(T data) {}

    
public T Pop() {}

    
public IEnumerator<T> GetEnumerator() {

        
for (int i = count – 1; i >= 0--i) {

           yield 
return items[i];

        }


    }


}

方法GetEnumerator是Stack<T>变成一个可以枚举的类型.下面的例子展现了如何用foreach来列举栈中的成员.
using System;

class Test

{

    
static void Main() {

        Stack
<int> stack = new Stack<int>();

        
for (int i = 0; i < 10; i++) stack.Push(i);

        
foreach (int i in stack) Console.Write("{0} ", i);

        Console.WriteLine();

    }


}


posted on 2005-11-27 12:22  佛西亚  阅读(311)  评论(0编辑  收藏  举报