文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>IEnumerable和IEnumerator浅谈(原创)

IEnumerable和IEnumerator浅谈(原创)

时间:2011-01-07  来源:--中庸--

遇到问题:

    自定义类型的数组,一般情况下是不支持foreach的,如何让自定义类型的数组支持foreach呢?

解决方法:

    让自定义类型的数组支持foreach,只要让其他类型(以下示例用这种方法比如:我想让Person类支持foreach,就让People类型实现IEnumerable,然后将定义好的数组传进来,就可以支持foreach了,如下代码)或者自定义类型实现(我猜测微软对某个类型的定义可能是按这种方法如:String实现了接口IEnumerable 如下定义 String[] s=new String[]{"123","456"},这样就可以支持foreach了)IEnumerable接口就可以了

示例如下:

      public class Person
     {
        public Person(string Name)
        {
            this.name=Name;
        }

        private string name;
    }

    public class People : IEnumerable//实现IEnumerable接口,只要重写GetEnumerator()就行
    {                                            //返回值IEnumerator
        private Person[] _people;
        public People(Person[] pArray)
        {
            _people = pArray;
        }

        public IEnumerator GetEnumerator()
        {
          return new PeopleEnum(_people);// 这句刚开始可能不知道;
        }
    }

按理说到这就可以了,因为已经实现了IEnumerable,但是它的函数GetEnumerator返回一个接口IEnumerator,

我们还没有实现。因为返回接口,所以我们一定要用类实现这个接口,如下代码:

    public class PeopleEnum : IEnumerator
    {
        public Person[] _people;

        // Enumerators are positioned before the first element
        // until the first MoveNext() call.
        int position = -1;

        public PeopleEnum(Person[] list)
        {
            _people = list;
        }

        public bool MoveNext()
        {
            position++;
            return (position < _people.Length);
        }

        public void Reset()
        {
            position = -1;
        }

        public object Current
        {
            get
            {
                try
                {
                    return _people[position];
                }
                catch (IndexOutOfRangeException)
                {
                    throw new InvalidOperationException();
                }
            }
        }
    }

    class IEnumerableTest2
    {
        static void Main()
        {
            Person[] peopleArray = new Person[3]
        {
            new Person("John", "Smith"),
            new Person("Jim", "Johnson"),
            new Person("Sue", "Rabon"),
        };

            People peopleList = new People(peopleArray);
            foreach (Person p in peopleList)
                Console.WriteLine(p.firstName + " " + p.lastName);
            Console.ReadKey();
        }
    }
看完了代码是不是明白一点了呢?

总结:

      1.支持foreach只要实现IEnumberable就可以了,而实现IEnumberable又要求实现IEnumberator.

      2. IEnumerable是一个声明式的接口,声明实现该接口的class是“可枚举(enumerable)”的,但并没有说明如何 

          实现枚举器,IEnumerator是一个实现式的接口,IEnumerator就是负责实现枚举器.

相关阅读 更多 +
排行榜 更多 +
XLM币最具爆发力的安全交易所币安binance下载

XLM币最具爆发力的安全交易所币安binance下载

金融理财 下载
XEM币最安全隐私链的全球交易所币安binance下载

XEM币最安全隐私链的全球交易所币安binance下载

金融理财 下载
WAVES币最新上线的优质交易所币安binance下载

WAVES币最新上线的优质交易所币安binance下载

金融理财 下载