(譯注:注意數組與集合的區別。數組是一次性分配的連續內 存,集合是可以動態添加與修改的,一般用鏈表來實現。而對於C#裡所支持的鋸 齒數組,則是一種折衷的處理。)
foreach總能保證最好的代碼。你不用 操心哪種結構的循環有更高的效率:foreach和編譯器為你代勞了。
如果 你並不滿足於高效,例如還要有語言的交互。這個世界上有些人(是的,正是他 們在使用其它的編程語言)堅定不移的認為數組的索引是從1開始的,而不是0。 不管我們如何努力,我們也無法破除他們的這種習慣。.Net開發組已經嘗試過。 為此你不得不在C#這樣寫初始化代碼,那就是數組從某個非0數值開始的。
// Create a single dimension array.
// Its range is [ 1 .. 5 ]
Array test = Array.CreateInstance( typeof( int ),
new int[ ]{ 5 }, new int[ ]{ 1 });
這段代碼應該足夠讓所 有人感到畏懼了(譯注:對我而言,確實有一點)。但有些人就是很頑固,無認你 如何努力,他們會從1開始計數。很幸運,這是那些問題當中的一個,而你可以 讓編譯器來“欺騙”。用foreach來對test數組進行迭代:
foreach( int j in test )
Console.WriteLine ( j );
foreach語句知道如何檢測數組的上下限,所以你應該這樣做 ,而且這和for循環的速度是一樣的,也不用管某人是采用那個做為下界。
對於多維數組,foreach給了你同樣的好處。假設你正在創建一個棋盤。 你將會這樣寫兩段代碼:
private Square[,] _theBoard = new Square[ 8, 8 ];
// elsewhere in code:
for ( int i = 0; i < _theBoard.GetLength( 0 ); i++ )
for( int j = 0; j < _theBoard.GetLength( 1 ); j++ )
_theBoard[ i, j ].PaintSquare( );
取而代之的是,你可以這樣簡單的畫這個棋 盤:
foreach( Square sq in _theBoard )
sq.PaintSquare( );
(譯注:本人不贊成這樣的方法。它隱藏了 數組的行與列的邏輯關系。循環是以行優先的,如果你要的不是這個順序,那麼 這種循環並不好。)
foreach語句生成恰當的代碼來迭代數組裡所有維數 的數據。如果將來你要創建一個3D的棋盤,foreach循環還是一樣的工作,而另 一個循環則要做這樣的修改:
for ( int i = 0; i < _theBoard.GetLength( 0 ); i++ )
for( int j = 0; j < _theBoard.GetLength( 1 ); j++ )
for( int k = 0; k < _theBoard.GetLength( 2 ); k++ )
_theBoard[ i, j, k ].PaintSquare( );