枚举器小小总结

 

一.IEnumerable、IEnumerable <T>接口

C#中对于所有数组,集合都可以用foreach遍历,如:

List<string> list=new List<string>();

foreach(string str in list)

{

    Console.WriteLine(str);

}

这是因为这些类都实现了IEnumerable或IEnumerable <T>接口。

二.自己写的类,实现IEnumerable接口,用foreach来遍历

public class Person:IEnumerable <string>

{

    public Person()

    {

        _names=new string[]{“shadow”,”TianJie”,”Tom”,”Joly”};

    }

      private string[] _names;

    public IEnumerator<string> GetEnumerator()

    {

              return new MyEnumerator(_names);

    }

}

 

public MyEnumerator:IEnumerator<string>

{

         public MyEnumerator(string[] names)

{

    this._names=names;

}

 

private string[] _names;

 

private int _index=-1;

 

public string Current

{

    get

    {

        return _names[_index];

    }

}

 

public bool MoveNext()

{

    return ++_index<this._names.Length;

}

 

public void Reset()

{

    _index=-1;

}

 

public void Dispose()

{

 

}

}

 

于时,可用以下方法遍历Person类中的_names数组:

Person p=new Person();

foreach(string str in p)

{

    Console.WriteLine(str);

}

它就相当于:

Person p=new Person();

MyEnumerator<string> etor=p.GetEnumerator();

try

{

    while(etor.MoveNext())

    {

             Console.WriteLine(etor.Current);

    }

}

finally

{

         etor.Dispose();

}

 

三.由于上述方法太过繁琐,也可以用yield关键字

 

public class Person:IEnumerable <string>

{

public Person()

{

    _names=new string[]{“shadow”,”TianJie”,”Tom”,”Joly”};

}

 

         private string[] _names;

 

public IEnumerator<string> GetEnumerator()

{

              for(int i=0;i<_names.Length;i++)

{

    yield return _names[i];

}

}

}

 当然,它本质上和第二条说的方法是一样的,通过反编译器就可以发现。

posted @ 2013-06-12 19:53  孤独の巡礼  阅读(161)  评论(0编辑  收藏  举报