Custom classes implement IEnumerable and IEnumerator interfaces

Function: custom class implements IEnumerable and IEnumerator interfaces

/// <summary>
/// 功能:自定义类实现IEnumerable和IEnumerator接口
/// </summary>
public class IEnumerableCode : MonoBehaviour
{
    void Start()
    {
        // Foreach_Test_1();
        // Foreach_Test_2();
        // Foreach_Test_3();
        DebugSample();
    }

    void Foreach_Test_1()
    {
        List<int> intList = new List<int>() {1,2,3,4,5};
        foreach(var item in intList)
        {
            Debug.Log("完整写:"+item);
        }

        // List继承IEnumerable类    可调用遍历元素方法
        intList.ForEach( a => { Debug.Log("简写:"+a); });
    }

    void Foreach_Test_2()
    {
        Student a = new Student(0,"a");
        Student b = new Student(1,"b");
        Student c = new Student(2,"c");
        Student[] studentsInOneClass = new Student[3]{a,b,c};

        // 集合同样继承IEnumerable类    可以使用Foreach进行遍历
        foreach(var item in studentsInOneClass)
        {
            Debug.Log($"普通输出id:{item.id}");
        }

        ClassSimpleIEnumerable classSimpleOne = new ClassSimpleIEnumerable(1,studentsInOneClass);
        foreach(Student item in classSimpleOne)
        {
            Debug.Log($"实现迭代器输出名字name:{item.name}");
        }
    }

    void Foreach_Test_3()
    {
        IEnumerator iterator = TestIEnumerator01().GetEnumerator();
        while(iterator.MoveNext())
        {
            Debug.Log("游标移动测试:"+iterator.Current);
        }
    }

    IEnumerable TestIEnumerator01()
    {
        for(int i = 0;i<5;i++)
        {
            yield return i;
        }
        /* 空返回值NULL */
        // yield return null;
    }

    /* 对每第N个数据元素进行采样的方法 */
    IEnumerable<T> Sample<T>(IEnumerable<T> sourceSequence, int interval)
    {
        int index = 0;
        foreach(T item in sourceSequence)
        {
            // ++index  3,6,9   index++ 1,4,7,10
            if(index++ % interval == 0)
                yield return item;
        }
    }

    void DebugSample()
    {
        IEnumerator iterator = Sample<int>(new int[] {1,2,3,4,5,6,7,8,9,10},3).GetEnumerator();
        while(iterator.MoveNext())
        {
            Debug.Log(iterator.Current);
        }
    }

    public class Student
    {
        public int id;
        public string name;

        public Student(int id, string name)
        {
            this.id = id;
            this.name = name;
        }
    }

    public class ClassSimpleIEnumerable : IEnumerable
    {
        private int index;
        private Student[] students;

        public ClassSimpleIEnumerable(int index, Student[] students)
        {
            this.index = index;
            this.students = students;
        }

        public IEnumerator GetEnumerator()
        {
            Debug.Log("Use Array GetEnumerator");
            return students.GetEnumerator();
        }

        // /* 上方代码已继承数字的IEnumerator */
        // public class ClassSimpleIEnumerator : IEnumerator
        // {
        //     private int index;
        //     private ClassSimpleIEnumerable c;
        //     public ClassSimpleIEnumerator(ClassSimpleIEnumerable c)
        //     {
        //         this.c = c;
        //     }

        //     object IEnumerator.Current {get{ return c.students[index];}}

        //     public bool MoveNext()
        //     {
        //         if(index < c.students.Length - 1 )
        //         {
        //             index++;
        //             return true;
        //         }
        //         else
        //         {
        //             return false;
        //         }
        //     }

        //     public void Reset()
        //     {
        //         index = -1;
        //         Debug.Log("ReSet");
        //     }
        // }
    }

    public class ClassGenericIEnumerable : IEnumerable<Student>
    {
        private int id;
        private Student[] students;

        public ClassGenericIEnumerable(int id, Student[] students)
        {
            this.id = id;
            this.students = students;
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            Debug.Log("Use Array GetEnumerator");
            return students.GetEnumerator();
        }

        IEnumerator<Student> IEnumerable<Student>.GetEnumerator()
        {
            Debug.Log("Use Self GetEnumerator");
            return new ClassGenericIEnumerator(this);
        }

        public class ClassGenericIEnumerator : IEnumerator<Student>
        {
            private int index = -1;
            private ClassGenericIEnumerable c;
            public ClassGenericIEnumerator(ClassGenericIEnumerable c)
            {
                this.c = c;
            }

            public Student Current {get {return c.students[index];}}

            object IEnumerator.Current {get{return c.students[index];}}

            public void Dispose()
            {
                Debug.Log("Dispose");
            }

            public bool MoveNext()
            {
                if(index < c.students.Length - 1)
                {
                    index++;
                    return true;
                }
                else
                {
                    return false;
                }
            }

            public void Reset()
            {
                index = -1;
                Debug.Log("Reset");
            }

        }
    }
}

Guess you like

Origin blog.csdn.net/weixin_51669718/article/details/128455678