程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Foreach原理,javaforeach原理

Foreach原理,javaforeach原理

編輯:C#入門知識

Foreach原理,javaforeach原理


本質:實現了一個IEnumerable接口,

01.為什麼數組和集合可以使用foreach遍歷?

解析:因為數組和集合都實現了IEnumerable接口,該接口中只有一個方法,GetEnumerator()

02.數組是一種數據結構,它包含若干相同類型的變量。數組是使用類型聲明的:type[] arrayName;

03.數組類型是從抽象基類型 Array 派生的引用類型。由於此類型實現了 IEnumerable ,因此可以對 C# 中的所有數組使用 foreach 迭代。(摘自MSDN)

我們都知道foreach可以遍歷ArrayList集合

我們可以F12過去看看它的內部微軟寫好的代碼

01.

.

 

02.

 

 

03.

 

04.

下面我們自己來模擬實現微軟的方法:

1.MyCollection類實現IEnumerable接口

 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Foreach原理
{
    //自定義類型:實現IEnumerable接口,證明這個類型保存的數據能被foreach遍歷
    public class MyCollection : IEnumerable
    {
        //01給集合添值得方法
        public void Add(object o)
        {
            list.Add(o);
        }
        //02定義一個集合
        ArrayList list = new ArrayList();
        //03實現GetEnumerator方法
        public IEnumerator GetEnumerator()
        {
            return new MyIEnumerator(list);
        }
    }
}

02.MyIEnumerator類實現IEnumerator接口

 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Foreach原理
{
    //IEnumerator:支持對非泛型集合的簡單迭代
   public  class MyIEnumerator : IEnumerator
    {
        //定義一個List集合
        ArrayList list = new ArrayList();

        public MyIEnumerator(ArrayList mylist)
        {
            //給當前類的集合賦值
            list = mylist;
        }
        //默認將集合的索引指向前一個 即第一條數據之前
        private int i = -1;

       //返回當前循環遍歷索引的值
        public object Current
        {
            get { return list[i]; }
        }
        //實現接口的Movenext方法
        public bool MoveNext()
        {
            bool flag = false;//默認為沒有數據
            if (i < list.Count - 1)
            {
                //證明集合中有數據讓索引加1
                i++;
                //改變bool值為true
                flag = true;
            }
            return flag;
        }
        //把i初始化為-1
        public void Reset()
        {
            i = -1;
        }
    }
}

03.在Main方法中調用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Foreach原理
{
    class Program
    {
        static void Main(string[] args)
        {
            //01.實例化實現了IEnumerable接口的MyCollection類
            MyCollection list = new MyCollection();
            //02.向集合添加元素
            list.Add("小張");
            list.Add("小王");
            //03.方可使用foreach循環遍歷出結果
            foreach (string item in list)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
    }
}

這就是foreach遍歷集合或數組的原理或實質。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved