foreach語句實現迴圈

2021-04-23 05:47:49 字數 3848 閱讀 6810

迴圈語句是程式設計的基本語句,在c#中除了沿用c語言的迴圈語句外,還提供了foreach語句來實現迴圈。那麼我要說的就是,在迴圈操作中盡量使用foreach語句來實現。

為了來更好地說明為什麼要提倡使用foreach,用如下三種不同方式來編寫迴圈語句。

int narray = new

int[100];

// use "foreach" to loop array

foreach( int i in narray )

debug.writeline( i.tostring() );

// use "for" to loop array

for( int i = 0; i < narray.length; i++ )

debug.writeline( narray[i].tostring() );

// another way using "for" to loop array

int nlength = narray.length;

for( int i = 0; i < nlength; i++ )

debug.writeline( narray[i].tostring() );

很明顯,

foreach語句很簡潔,但是它的優點不僅僅在於此,它的效率也是最高的。可能很多人認為最後一種的效率會更高,因為表面上看著不用每次訪問引用型別的屬性。可是它卻是三者當中,效率最低的。因為c#是強型別檢查,那麼對於陣列訪問的時候,要對索引的有效值進行判斷,那麼對於最後一種**實際產生的效果如同下面的**一樣。

// another way using "for" to loop array

int nlength = narray.length;

for( int i = 0; i < nlength; i++ )

(書中這裡有些出入,經過網友

sozdream的提示,在1.1環境下發現最後一種方法是最快的,前兩者的速度基本相等;通過dissambly檢視最後一種迴圈方法所產生的**,並沒有產生類似於文章所說的那種索引檢查。不過還是不建議使用最後一種,因為此方法對索引的判斷有些脫節,尤其是當迴圈中陣列尺寸發生變化的時候,索引有效檢查無法及時進行)

foreach語句除了簡潔和高效外,還有很多優點,接下來一一枚舉。

第乙個就是不用考慮陣列起始索引是幾,很多人可能從其他語言轉到

c#的,那麼原先語言的起始索引可能不是

1,例如

vb或者

delphi語言,那麼在

c#中使用陣列的時候就難免疑問到底使用

0開始還是用

1開始呢,那麼使用

foreach就可以避免這類問題。

第二個好處就是對於多維陣列操作用

foreach就非常簡便了,例如:

int[,] nvisited = new

int[8,8];

// use "for" to loop two-dimension array

for( int i = 0; i < nvisited.getlength(0); i++ )

for( int j = 0; j < nvisited.getlength( 1 ); j++ )

debug.writeline( nvisited[i,j].tostring() );

// use "foreach" to loop two-dimension array

foreach( int i in nvisited )

debug.writeline( i.tostring() );

對於三維或更多維,foreach語句不用發生任何變化,而對於for語句來說就要進行修改了,這裡就不多說了。

第三個要說的就是

foreach完成型別轉換操作,這種體現可能通過如上的例子看不出任何效果,但是對於

arraylist之類的資料集來說,這種操作就顯得比較突出,例如:

// init an arraylist object

int narray = new

int[100];

arraylist arrint = new arraylist();

arrint.addrange( narray );

// use "foreach" to loop an arraylist

foreach( int i in arrint )

debug.writeline( i.tostring() );

// use "for" to loop an arraylist

for( int i = 0; i < arrint.count; i++ )

最後要說的是使用

foreach並沒有增加資源使用,這句話聽得有些難懂,由於對於繼承了

ienumerable介面的型別資料,才能使用

foreach語句,那麼對於使用

foreach會訪問

ienumerable介面中

getenumerator方法來進行列舉,那麼對於如上的foreach語句,對應的語句其實如下:

ienumerator it = arrint.getenumerator() as ienumerator;

using( idisposable disp = it as idisposable )

} 也就是說在出了

foreach之後對於

ienumerator的物件也進行

dispose處理。

對於foreach說了這麼多好處,那麼在使用它是否可以無懈可擊呢。其實不是這樣的,在foreach語句中有兩個限制,第一不能修改列舉成員,其次不要對集合進行刪除操作。也就是如下兩種方式都是錯誤的。

// use "foreach" to loop an arraylist

foreach( int i in arrint )

// use "foreach" to loop an arraylist

foreach( int i in arrint )

那麼對於如上兩個操作,可以用for來實現,此外這裡多說一句,就是對於乙個記錄集的多條資料刪除問題,也是經常出現問題的地方(論壇上經常問類似的問題),由於在一些記錄集中進行刪除的時候,在刪除操作之後相應的索引也發生了變化,這時候的刪除要反過來進行刪除,大致形式如下。

// use "for" to loop an arraylist

for( int i = arrint.count - 1; i >=0; i-- )

除了這兩個地方外,foreach可以基本適用於任何迴圈,因此對於迴圈的編寫要盡量使用foreach,因為它會使你的**清晰簡潔,又不失高效。

迴圈結構 for語句和foreach語句

迴圈語句可以在滿足迴圈條件下,反覆執行某一段 這段被重複執行的 被稱為迴圈體語句,當反覆執行這個迴圈體時,需要在合適的時候把迴圈判斷條件修改為false,從而結束迴圈,否則迴圈將一直執行下去,形成死迴圈。迴圈四要素 一般用於次數已知的情況下 for迴圈語句格式 for 初始化語句 繼續條件 步長 執...

PHP中foreach迴圈語句

一 語法 foreach array expression as value statement foreach array expression as key value statement foreach語句將遍歷陣列 array expression,每次迴圈時,將當前陣列中的值賦值給 val...

foreach迴圈語句的用法

陣列當成乙個鍵值隊裡面,分別進行賦值 陣列的下標沒有規律或者有規律都可以進行使用,此時此刻用foreach都可以進行應用,不需要用for的便利迴圈,因為下標是不規律的只能進行賦值。print r也是用於輸出陣列,只是他不會輸出型別,在遍歷當中的的新的元素的不會改變陣列當中的元素,鍵值是成對的是可以相...