C# 2.0中的迭代器zz

 zz from WebCast—C#2.0锐利体验

 

C# 2.0中的迭代器只是通过编译器的一层额外处理,来简化创建可用于foreach的枚举集合的工作。

没有迭代器的时候,创建一个可用于foreach的集合(C# 1.0):

public   class  MyCollection : IEnumerable 
{
    
public MyEnumerator GetEnumerator()
    
{
        
return new MyEnumerator(this);
    }


    
public class MyEnumerator : IEnumerator 
    
{
        
public void Reset(){… }
        
public bool MoveNext(){ … }
        
public int Currentget{ … } }
        
object IEnumerator.Current get{ … } }
    }

}



使用迭代器创建用于foreach的集合(C# 2.0):

public   class  Stack < T > : IEnumerable < T > // 讲义中的示例用的泛型接口IEnumerable<T>,但好像编译不过
{
    T[] items;
    
int count;
    
public void Push(T data) {}
    
public T Pop() {return default(T);}
    
/*我觉得使用泛型接口IEnumerator<T>和IEnumerable<T>并没有错,但编译却有错误:error CS0536:“Test.TestStack<T>”不会实现接口成员“System.Collections.IEnumerable.GetEnumerator()”。Test.TestStack<T>.GetEnumerator()”或者是静态、非公共的,或者有错误的返回类型。*/
    
public IEnumerator<T> GetEnumerator()
    
{
        
for(int i = count – 1; i >= 0--i)
            
yield return items[i];
    }

}


// 下面的代码用的非泛型接口IEnumerable,可以编译通过并正确运行:)
public   class  TestStack < T > : IEnumerable
{
    T[] items 
= new T[10];
    
int count=0;
    
public void Push(T data) {}
    
public T Pop() {return default(T);}
    
public IEnumerator GetEnumerator()
    
{
 
for(int i = count-1; i>= 0--i)
     
yield return items[i];
    }

}



使用foreach语句:

Stack < int >  stack  =   new  Stack < int > ();
foreach  ( int  i  in  stack)  { ……. }



使用迭代器创建倒序遍历:

public  IEnumerable < T >  BottomToTop 
{
    
get {
       
for (int i = 0; i < count; i++{
           
yield return items[i];
       }

    }

}

 


使用yield return 产生枚举元素:

for  ( int  i  =  count –  1 ; i  >=   0 -- i)  {
    
yield return items[i];
}

 


使用yield break 中断迭代:

for  ( int  i  =  count –  1 ; i  >=   0 -- i)  {
    
yield return items[i];
    
if(items[i]>10)
        
yield break;
}

你可能感兴趣的:(C# 2.0中的迭代器zz)