IEnumerable 介面 實現foreach 遍歷 例項

atliwen發表於2014-04-09

 額 為啥寫著東西?  

          有次面試去,因為用到的時候特別少 所以沒記住, 這個單詞 怎麼寫!

                經典的面試題:

                       能用foreach遍歷訪問的物件的要求?

                 答:  該類實現IEnumetable 介面   宣告 GetEnumerator 方法。  

                 這是統一的答案 非常正直 不是嘛?  

                 但是 你真正的寫過 這個功能嗎?  

   今天看MSDN 關於 IEnumetable   第一次看這個介面   沒看明白 !   怎麼辦?  自己跟著寫一次!  這個辦法非常好,我特推薦!

   命名規則就隨便了, 別噴。

 

/// <summary>
   /// 首先繼承Ienumerable 介面
   /// </summary>
   public class Ns : IEnumerable
    {

        private List<object> list = new List<object>(); // 先定義委會的集合物件

        private string name;

        private string age;

        private int id;

        public string Name
        {
            get
            {
                return this.name;
            }
            set
            {
                this.list.Add(value);   // 特殊操作  賦值的時候將其先新增到維護的集合物件中
                this.name = value;
            }
        }

        public string Age
        {
            get
            {
                
                return this.age;
            }
            set
            {
                this.list.Add(value);   // 特殊操作  賦值的時候將其先新增到維護的集合物件中
                this.age = value;
            }
        }

        public int Id
        {
            get
            {
                
                return this.id;
            }
            set
            {
                this.list.Add(value);  // 特殊操作  賦值的時候將其先新增到維護的集合物件中
                this.id = value;
            }
        }

       /// <summary>
       ///  必須實現 GetEnumerator方法 更具返回型別 IEnumerator 來建立一個繼承 IEnumerator介面的內部類
       /// </summary>
       /// <returns></returns>
        public IEnumerator GetEnumerator()
        {
            return new NsIEnumerator(this);
        }


        /// <summary>
        /// IEnumerator介面的內部類  PS  該類其實就是對 維護著的集合物件做遍歷操作的
        /// </summary>
        class NsIEnumerator : IEnumerator
        {

            private int ids = -1;   // 當前下標

            private Ns n;           // 傳遞過來的 需要遍歷的類

            public NsIEnumerator(Ns N)
            {
                this.n = N;
            }

            public bool MoveNext()     // 判斷是否遍歷完畢
            {
                this.ids++;
                return (this.ids < this.n.list.Count);
            }

            public void Reset()     // 將下標重置
            {
                this.ids = -1;
            }

            public object Current   //  這個就是通過變換的下標獲取到的對應的 資料
            {
                get
                {
                    return this.n.list[this.ids];
                }
            }
        }

        static void Main(string[] args)
        {

            Ns n = new Ns();

            n.Id = 1;
            n.Name = "liwen";
            n.Age = "18";
           
            foreach (var n1 in n)
            {
                Console.WriteLine(n1);
            }

            Console.ReadKey();
        }

    }

 

 沒啥特別的 ,就是覺得可能很多人也和我一樣知道這個功能 但是卻自己沒實現過。 貼上個來讓那些人看一下。方便大家嘛

  

 

 

 

相關文章