foreach内部原理

来源:互联网 发布:网络音乐地址mp3格式 编辑:程序博客网 时间:2024/05/14 13:03

实现了IEnumerator接口和GetEnumerator()方法的类都可以进行foreach排序。

1,建一个Myclass类,实现IEnumerable接口,在该接口中有个GetEnumerator()方法,返回值类型为IEnumerato,在建一个辅佐类实现了IEnumerato接口



using System;

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


namespace _05_foreach
{
    class Myclass :IEnumerable
    {
        /// <summary>
        /// 枚举器
        /// </summary>
        public class MyClassEnum : IEnumerator
        {
            public Student[] students;
            public MyClassEnum(Student[] students)
            {
                this.students = students;
            }
            private int position = -1;
            public object Current
            {
                get { return students[position]; }
            }


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


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


        private Student[] _students;
        public Myclass(Student[] stu)
        {
            this._students = stu;
        }
        public IEnumerator GetEnumerator()
        {
            return new MyClassEnum(_students);
        }
    }

}


--------------学生类---------------

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


namespace _05_foreach
{
    class Student
    {
        public Student(string name)
        {
            this.name = name;
        }
        private string name;


        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }
}



------------------------调用myclass类对student[] 进行排序

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


namespace _05_foreach
{
    class Program
    {
        static void Main(string[] args)
        {
            Student stu1 = new Student("张三");
            Student stu2 = new Student("李四");
            Student stu3 = new Student("王五");
            Myclass my = new Myclass(new Student[] { stu1, stu2, stu3 });
            foreach (Student item in my)
            {
                Console.WriteLine(item.Name);
            }
            Console.Read();
        }
    }
}