1. 程式人生 > >《隨筆十三》——C#中的 “ foreach 語句”

《隨筆十三》——C#中的 “ foreach 語句”

目錄

迭代變數是隻讀的

交錯陣列使用foreach 迴圈


 ● foreach 語句允許我們依次訪問某個序列中的元素,並且不存在訪問非法元素的危險。 不需要考慮該序列中有多少個元素, 並可以確保將在迴圈中使用每個元素。  語法為:

foreach (Type Indentifier in ArrayName)
{

     //Satement
}

或者

foreach (var Indentifier in ArrayName)
{

     //Satement
}

迭代變數是臨時的, 並且和陣列中的元素的型別相同。● 注意: 每次迭代都會重新定義迭代變數,Identifier部分的變數會被初始化為 ArrayName 部分的下一個元素的值(或者說: 並將其初始化序列中的下一個值)。

然後執行語句主體,在該主體中,我們可以把迭代變數作為序列中的元素只讀別名。

在主體執行之後, foreach 語句 選擇該序列中的下一個元素並重復處理。

 


迭代變數是隻讀的


對於值型別陣列, 我們在用迭代變量表示陣列元素的時候, 我們不能改變它:

            int[] arr = { 0, 1, 2, 3 };
            foreach(var tt  in arr)
            {
                ++tt;   //錯誤,不能改變迭代變數的值
            }

對於引用型別陣列,我們也不能該變迭代變數, 但是迭代變數只是儲存了資料的引用, 而不是資料本身。 因此,我們雖然不能改變引用,但是我們可以通過迭代變數改變引用的資料。

namespace HelloWorld_Console
{
    class MyClass
    {
        public int MyField = 0;
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyClass[] mcArray = new MyClass[4];
            for (int i = 0; i < mcArray.Length; ++i)
            {
                mcArray[i] = new MyClass();  // 建立類物件
                mcArray[i].MyField = i;   // 建立欄位
            }
            foreach (MyClass item in mcArray)
            {
                item.MyField += 10;
                WriteLine(item.MyField);
            }
            ReadKey();
        }
    }
}

輸出結果為:

10
11
12
13

交錯陣列使用foreach 迴圈


一個交錯陣列是陣列的陣列, 我們必須為交錯陣列中的每一個維度使用獨立的foreach 語句。 foreach 語句必須巢狀以確保每一個巢狀陣列都被正確處理。

   int[][] myInt = new int[3][] { new int[] { 1, 2, 3 }, new int[] { 1 }, new int[] { 1, 2 } }; //正確
            foreach (int[] divisor in myInt) //處理頂層陣列
            {
                foreach (int temp in divisor)  //處理第子陣列
                {
                    WriteLine(temp);
                }
            }

在該程式碼中, 第一個foreach 語句遍歷了頂層陣列  myInt 第一個子陣列, 內部的foreach語句處理了子陣列的,每一個元素。