c#實現foreach

方式:

第一種,通過繼承IEnumerable接口實現foreach語句。

     包括MoveNext、Reset函數和Current屬性,以便GetEnumerator函數能獲取枚舉數。


第二種,用迭代器實現枚舉器。

  • 迭代器是可以返回相同類型的值的有序序列的一段代碼。

  • 迭代器可用作方法、運算符或 get 訪問器的代碼體。

  • 迭代器代碼使用 yield return 語句依次返回每個元素。yield break 將終止迭代。有關更多信息,請參見 yield

  • 可以在類中實現多個迭代器。每個迭代器都必須像任何類成員一樣有唯一的名稱,並且可以在 foreach 語句中被客戶端代碼調用,如下所示:foreach(int x in SampleClass.Iterator2){}

  • 迭代器的返回類型必須爲 IEnumerable、IEnumerator、IEnumerable<T> 或 IEnumerator<T>。

yield 關鍵字用於指定返回的值。到達 yield return 語句時,會保存當前位置。下次調用迭代器時將從此位置重新開始執行。


  

 public class 雞
    {
        int 身高;
        int 體重;
        int 三圍;
        public 雞(int _身高, int _體重, int _三圍)
        {
            身高 = _身高;
            體重 = _體重;
            三圍 = _三圍;
        }
        public override string ToString()
        {
            return string.Format("我是一隻雞。我身高是:{0},我的體重是:{1},我的三圍是{2}", 身高, 體重,三圍); 
        }
    }

  
    public class 雞羣 : IEnumerator,IEnumerable
    {
       int position = -1;
        private 雞[] ji;
        public 雞羣(雞[] pArray)
        {
            ji = new 雞[pArray.Length];
            for (int i = 0; i < pArray.Length; i++)
            {
                ji[i] = pArray[i];

            }
        }

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

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

        public object Current
        {
            get
            {
                return ji[position];
            }
        }
        /// <summary>
        /// 返回一個循環訪問集合的枚舉器。
        /// </summary>
        /// <returns></returns>
        public IEnumerator GetEnumerator()
        {
            return new 雞羣(ji);
        }
    }

    class Program
    {
   
        static void Main(string[] args)
        {

            雞[] jis = new 雞[] 
            {
                new 雞(10, 10,80),
                new 雞(20, 20,90),
                new 雞(30, 30,100),
            };

            雞羣 jiqun = new 雞羣(jis);

            foreach (var item in jiqun)
            {
                System.Console.WriteLine(item);
            }

            while (jiqun.MoveNext())
            {
                System.Console.WriteLine(jiqun.Current);
            }

            System.Console.ReadKey();

            雞羣2 jiqun2 = new 雞羣2(jis);

            foreach (var item in jiqun2)
            {
                System.Console.WriteLine(item);
            }
            System.Console.ReadKey();


        }
    }




    public class 雞羣2
    {
        private 雞[] ji;

        public 雞羣2(雞[] list)
        {
            ji = list;//引用類型
        }

        public IEnumerator GetEnumerator()
        {
            for (int i = 0; i < ji.Length; i++)
            {
                yield return ji[i];
            }
        }

    }


 






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章