1. 程式人生 > >C# foreach遍歷原理-建立列舉器實現遍歷(不使用foreach,實現遍歷)

C# foreach遍歷原理-建立列舉器實現遍歷(不使用foreach,實現遍歷)

昨天看了一下foreach實現原理(通過建立列舉器),今天將知識彙總下方便以後回頭看看,同時希望可以幫到更多的人。

廢話不多說,上正式解釋。


其實通過foreach遍歷資料,實際上是呼叫了一個“列舉器”來遍歷資料,和foreach一點關係都沒有,而foreach只是語法上的一個簡化而已。寫foreach只是降低列舉的複雜度,使程式設計師不用自己寫複雜的遍歷邏輯,只用呼叫foreach即可實現。

但是想我們這樣不平凡的人,怎麼甘願總用著foreach卻不懂其原理呢!  哈哈

上程式碼:

namespace FanXing
{
    // 需要讓該型別實現一個叫IEnumerable的介面,並重寫GetEnumerator方法(注意重寫完此方法後,介面可刪除。其實需要的不是這個介面而是這個方法)
    class ForeachFX : IEnumerable
    {
        string[] m_love = new string[] { "理智", "林青霞", "李若彤", "劉亦菲" };

        // 這個方法的作用是獲取一個列舉器
        public IEnumerator GetEnumerator()

        {

            return new ForeachEnumerator(this.m_love); // return一個ForeachEnumerator物件
            //throw new NotImplementedException();
        }
    }

    // 這個型別就是一個列舉器
    class ForeachEnumerator : IEnumerator
    {
        string[] m_love = null;
        int index = -1; // 根據索引下標遍歷陣列,注意:下標一般都起到開始的前一個

        public ForeachEnumerator(string[] m_love)
        {
            this.m_love = m_love;
        }

        public object Current // 當前值。如其所是為object型別
        {
            get
            {
                if(index >= 0 && index < m_love.Length)
                {
                    return m_love[index];
                }else
                {
                    throw new IndexOutOfRangeException();
                }
            }
        }

        public bool MoveNext() // 獲取下一個
        {
            if(index + 1 < m_love.Length)
            {
                index++;
                return true;
            }
            return false;
            //throw new NotImplementedException();
        }

        public void Reset() // 將index重置為-1
        {
            index = -1;
        }
    }

}


main 函式程式碼:

ForeachFX foreachfx = new ForeachFX();
            // 呼叫GetEnumerator方法,返回ForeachEnumerator物件傳給IEnumerator
            IEnumerator ienumerator = foreachfx.GetEnumerator();
            while (ienumerator.MoveNext()) // 呼叫MoveNext()方法,進行下一個
            {
                // 輸出Current
                Console.WriteLine(ienumerator.Current.ToString());
            }
            // 重置,將index重置為-1
            ienumerator.Reset();
            Console.ReadKey();


如以上所示,就建立一個列舉器,通過以上列舉器就可以實現foreach的遍歷。而兩個類分別繼承的IEnumerable、IEnumerator介面,皆可刪除。介面中重寫的方法才是我們寫上介面的目的。