.Net2.0 New Feature(二) 迭代器

       在1.X中可以使用foreach循环来遍历诸如数组,集合这样的数据结构,只不过自定义的数据集合必须实现IEnumerable接口的GetEnumerator方法,同事,该数据集合中的元素还必须实现IEnumerator接口成员。在1.X实现迭代器相对于所提供的功能来说太过于笨拙了,而且,如果数据集合中包含值类型,则需要进行装箱和拆箱的操作才能获得相应的项,这将导致潜在的性能上的降低和托管堆压力的增大。2.0中提供了真正意义上的迭代器。

   迭代器是 C# 2.0 中的新功能。迭代器是方法、get 访问器或运算符,它使您能够在类或结构中支持 foreach 迭代,而不必实现整个 IEnumerable 接口。您只需提供一个迭代器,即可遍历类中的数据结构。当编译器检测到迭代器时,它将自动生成 IEnumerable 或 IEnumerable 接口的 Current、MoveNext 和 Dispose 方法。

迭代器概述

    迭代器并非一种如Int,Bool等数据类型,也不是一种goto,break等语句,她是一个返回相同类型值的有序序列的一段代码,迭代器可用作方法、运算符或 get 访问器的代码体中。

创建迭代器可以实现IEnumerable<T>,或者IEnumerable接口的GetEnumerator成员方法。如果类实现了IEnumerable<T>接口,那么创建的是泛型迭代器;如果实现的是IEnumerable接口,则创建的是非泛型迭代器。同时在GetEnumerator方法中使用 yield return 语句依次返回每个元素。yield break 将终止迭代。但是yield不能出现在匿名方法,或者catch块中,或者含有一个或多个catch子句的try块中。yield return 语句不能与其他return语句一起使用。yield 关键字用于指定返回的值。到达 yield return 语句时,会保存当前位置。下次调用迭代器时将从此位置重新开始执行。可以在类中实现多个迭代器。每个迭代器都必须像任何类成员一样有唯一的名称,并且可以在 foreach 语句中被客户端代码调用,如下所示:foreach(int x in MyClass.MyIterator){} ,迭代器的返回类型必须是IEnumerable,IEnumerator,IEnumerable<T>,IEnumerator<T>类型之一。

泛型迭代器实例  

using  System;
using  System.Collections;
using  System.Collections.Generic;
public   class  Team < T >
{
    
private  T[] m_Members;
    
public  Team ( params  T[] members)
    {
        m_Members 
=   new  T[members.Length];
        members.CopyTo(m_Members, 
0 );
    }

    
public  IEnumerable < T >  GetMembers ()
    {
        
for  ( int  i  =   0 ; i  <  m_Members.Length; i ++ )
        {
            yield 
return  m_Members[i];
        }
    }
}

class  NameOfMyTeam
{
    
static   void  Main ()
    {
        Team
< String >  team  =   new  Team < String > ( " Anthan " " Bonnie " " Coco " " David " " Oliver " " Mona " " Edward " " Scott " " Joy " );
        
foreach  ( string  member  in  team.GetMembers())
        {
            System.Console.Write(member 
+   "   " );
        }
    }
}

输出

Anthan Bonnie Coco David Oliver Mona Edward Scott Joy

非泛型迭代器示例

using  System;
using  System.Collections;
using  System.Collections.Generic;

public   class  Team : IEnumerable
{
    
string [] m_Members  =  {  " Anthan " " Bonnie " " Coco " " David " " Oliver " " Mona " " Edward " " Scott " " Joy "  };

    
public  IEnumerator GetEnumerator ()
    {
        
for  ( int  i  =   0 ; i  <  m_Members.Length; i ++ )
        {
            yield 
return  m_Members[i];
        }
    }
}

class  NameOfMyTeam
{
    
static   void  Main ()
    {
                Team team 
=   new  Team();
        
foreach  ( string  member  in  team)
        {
            System.Console.Write(member 
+   "   " );
        }
    }
}

输出

Anthan Bonnie Coco David Oliver Mona Edward Scott Joy

 

转载于:https://www.cnblogs.com/Anthan/archive/2007/05/31/766071.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值