foreach循环遍历类数组

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/**
 * 使用foreach循环遍历一个Person封装类数组
 * 要想用foreach循环遍历一个自己的类数组,
 * 这个类必须实现IEnumerable接口实现其中的GetEnumerator方法获得一个枚举器
 * GetEnumerator方法需要返回一个IEnumerator类型的参数,
 * 自定义一个枚举器类实现IEnumerator接口,编写其中的方法,使得返回想要的值就ok
 **/
namespace foreach枚举器
{
    class Program
    {
        static void Main(string[] args)
        {
            Person[] p = new Person[] {new Person("yajie",18),new Person("liupeng",19), new Person("liuxin", 20) };
            Person person = new Person(p);
            foreach (Person item in p)
            {
                Console.WriteLine(item.ToString());
            }
            Console.ReadKey();
        }
    }


    /**
     * 这个类中有两个构造函数,其中一个是对类中属性的初始化,
     * 另一个是要传Person类型的数组,方便在使用GetEnumerator()
     * 方法时传递需要遍历的数组
     * */
    class Person : IEnumerable
    {
        public Person(string name,int age)
        {
            this.Name = name;
            this.Age = age;
        }
        Person[] person;
        public Person(Person[] p)
        {
            this.person = p;
        }
       
        public string Name
        {
            get;
            set;
        }
        public int Age
        {
            get;
            set;
        }

        public override string ToString()
        {
            return this.Name + "→" + this.Age;
        }

        //将需要遍历的数组传递,同时返回遍历结果
        public IEnumerator GetEnumerator()
        {
            return new PersonEnumerator(person);
        }

    }

    //这就是一个自定义的枚举器,只要实现IEnumerator接口就ok
    class PersonEnumerator : IEnumerator
    {
        //初始化需要遍历的数组
        Person[] p;
        public PersonEnumerator(Person[] person)
        {
            this.p = person;
        }


        //初始化下标
        int index = -1;

        //这个就是返回的当前的数据
        public object Current => p[index];

        
        //这个函数用来实现下标的移动
        public bool MoveNext()
        {
            if(index+1< p.Length)
            {
                index++;
                return true;
            }
            return false;
        }

        //这个函数是将下标初始化回原来的数据,方便二次遍历
        public void Reset()
        {
            index = -1;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值