文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>C#数组(2)--枚举器迭代

C#数组(2)--枚举器迭代

时间:2011-03-26  来源:任银

 

  数组实现的接口:
  IEnumerable--用于迭代
  ICollection--派生于IEnumerable接口,用于确定集合元素个数等
  IList--派生于ICollection接口,Array类主要定义了Item索引访问器等,而对于集合所需的成员异常实现

  

  枚举器迭代:
  IEnumerator接口--用于迭代集合中的所有元素,实现成员MoveNext(),Current,ReSet()
  foreach语句使用了IEnumerator的接口和属性
  foreach语句解析
  foreach(Pseron p in persons)
  {
    Console.WriteLine(p);
  }
  不解析为IL 而是
  IEnumerator enumerator = persons.GetEnumerator();
  while(enumerator.MoveNext())
  {
     Pseron p = (Person)enumerator.Current;
     Console.WriteLine(p);
  }

  

枚举器迭代 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace 枚举器迭代
{
    public class HelloCollection
    {
        //自定义实现GetEnumerator()方法返回枚举器
        public IEnumerator GetEnumerator()
        {
            //yield return返回集合的一个元素,并移动到下一个
            //yield break停止迭代
            yield return "Hello";
            yield return "World";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            HelloCollection helloCollection = new HelloCollection();

            foreach (string s in helloCollection)
            {
                Console.WriteLine(s);
            }
            //foreach语句使用了IEnumerator的接口和属性
            //解析为
            //IEnumerator enumerator = helloCollection.GetEnumerator();
            //while (enumerator.MoveNext())
            //{
            //    string s = enumerator.Current.ToString();
            //    Console.WriteLine(s);
            //}
        }
    }
}

 

  


  yeild语句称为迭代块,yeild类型包含一个状态机,执行IEnumerator和IDisposable接口的方法和属性

  

yield_return实现集合的 倒序输出 子集合输出 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace yield_return实现集合的 倒序输出 子集合输出
{
    public class MusicTitles
    {
        string[] names ={
                           "Tubular Bells","Hergest Ridge",
                           "Ommadawn","Platinum"};

        //foreach数组时 默认调用GetEnumerator 因此该方法可以不写
        public IEnumerator GetEnumerator()
        {
            for (int i = 0; i < 4; i++)
            {
                yield return names[i];
            }
        }

        //倒序输出
        public IEnumerable Reverse()
        {
            for (int i = 3; i >= 0; i--)
            {
                yield return names[i];
            }
        }

        //子集输出
        public IEnumerable Subset(int index, int length)
        {
            for (int i = index; i < index + length; i++)
            {
                yield return names[i];
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MusicTitles titles = new MusicTitles();
            foreach (string title in titles)
            {
                Console.WriteLine(title);
            }
            Console.WriteLine();

            Console.WriteLine("reverse");
            foreach (string title in titles.Reverse())
            {
                Console.WriteLine(title);
            }
            Console.WriteLine();

            Console.WriteLine("subset");
            foreach (string title in titles.Subset(2, 2))
            {
                Console.WriteLine(title);
            }
        }
    }
}

 

 

相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载