1. 程式人生 > >集合遍歷:for VS foreach

集合遍歷:for VS foreach

假設我們擁有下面的集合
1None.gif            System.Collections.ArrayList list =new System.Collections.ArrayList();
2None.gif            list.Add(1);
3None.gif            list.Add(12);
4None.gif            list.Add(3);
5None.gif            list.Add(56);


現在我們要遍歷這個集合,我們有兩套方案

1、我們用for遍歷

1None.gifint tmp =0;
2None.gif            for (int i =1; i < list.Count;i++ )                 
3ExpandedBlockStart.gif            
{
4InBlock.gif                tmp += (int)list[i];
5ExpandedBlockEnd.gif            }
6None.gif
7None.gif            System.Console.WriteLine(tmp);

使用for遍歷,我們可以控制對集合中的區域性資料進行遍歷。但是,從ArrayList中獲取的資料要進行顯示的資料型別轉換。


2、我們使用foreach遍歷

1None.gif            tmp =0;
2None.gif
3None.gif            foreach (int i in list)                  //指定型別int
4ExpandedBlockStart.gif            {
5InBlock.gif                tmp += i;
6ExpandedBlockEnd.gif            }
7None.gif            System.Console.WriteLine(tmp);


使用foreach將自動迭代每個集合中的元素,且使用foreach表示式中指定的型別進行自動轉換。不必顯示轉換。


當需要迭代集合中所有元素且不關心先後次序時,建議使用foreach。因為大部分情況下在處理集合時,初始值和最終值的概念沒有意義,而且你也不必知道集合中包含多少元素。
不過,當你需要將迴圈的每次迭代與控制變數相關聯並可確定該變數的初始值和最終值時,那就用for,比如你需要明確知道元素在集合中的位置時。

除了上面的不同外,for和foreach還有一個很大的不同

1ExpandedBlockStart.gifint[] iarr =newint
[] 12345678 };
2None.gif            for (int i =0; i <= iarr.Length -1; i++)
3ExpandedBlockStart.gif            {
4InBlock.gif                System.Console.WriteLine(iarr[i]++);
5ExpandedBlockEnd.gif            }


輸出的結果是
1
2
3
4
5
6
7
8

但是

1ExpandedBlockStart.gifint[] iarr =newint[] dot.gif12345678 };
2None.gif            foreach (int i in iarr)
3ExpandedBlockStart.gif            {
4InBlock.gif                //i是一個迭代變數,無法為它賦值    5InBlock.gif                System.Console.WriteLine(i++);
6ExpandedBlockEnd.gif            }

就會報錯
i是一個迭代變數,無法為它賦值 
切記切記