1. 程式人生 > >構建可列舉型別(IEnumerable和IEnumerator介面)

構建可列舉型別(IEnumerable和IEnumerator介面)

1.IEnumberable介面

public interface IEnumberable
    {
        IEnumerator GetEnumerator();  //返回對另一個介面的引用IEnumerator
    }

2.IEnumerator介面

public interface IEnumerator
    {
        bool MoveNext();        //將游標的內部位置向前移動
        object Current { get; } //獲取當前的項
        void Reset();           //將游標重置到第一個成員前面
    }

3.實現可列舉型別

public class MyClass1
    {
        public string Name { get; set; }
        public string Id { get; set; }
    }

    public class MyClass2:IEnumerable
    {
        private MyClass1[] carArray = new MyClass1[4];
        public MyClass2()
        {
            carArray[0] = new MyClass1 { Name = "Test1", Id = "1" };
            carArray[1] = new MyClass1 { Name = "Test2", Id = "2" };
            carArray[2] = new MyClass1 { Name = "Test3", Id = "3" };           
        }


        public IEnumerator GetEnumerator()
        {
            return new MyClass3(carArray);
        }
    }


    public class MyClass3:IEnumerator
    {
        private MyClass1[] myCls1 = null;
        private int count = 0;
        public MyClass3(MyClass1[] myCls1)
        {
            this.myCls1 = myCls1;
        }
        public object Current
        {
            get { return myCls1[count]; }
        }


        public bool MoveNext()
        {
            count = count+1;
            if (count >= myCls1.Length)
            {
                return false;
            }
            else
            {
                return true;
            }
           
        }


        public void Reset()
        {
            count = 0;
        }
    }

    public class MyClass4
    {
        private void Func1()
        {
            MyClass2 cls2 = new MyClass2();
            foreach (MyClass1 item in cls2)
            {
                item.Name = "1";
                item.Id = "20";
            }
        }
    }

4.使用yield關鍵字構建迭代器方法

 public class MyClass2 : IEnumerable
    {
        private MyClass1[] carArray = new MyClass1[4];
        public MyClass2()
        {
            carArray[0] = new MyClass1 { Name = "Test1", Id = "1" };
            carArray[1] = new MyClass1 { Name = "Test2", Id = "2" };
            carArray[2] = new MyClass1 { Name = "Test3", Id = "3" };
        }


        public IEnumerator GetEnumerator()
        {
            //return new MyClass3(carArray);
            foreach (MyClass1 cls1 in carArray)
            {
                yield return cls1;
            }
        }
    }

編譯器幫我們生成了相關的類