程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Effective C#原則40:根據需求選擇集合(2)

Effective C#原則40:根據需求選擇集合(2)

編輯:關於C語言

每個內層的 一維數組可以有同不的大小。在需要不同大小的數組時可以使用鋸齒數據。使用 鋸齒數組的缺點是在列方面上的訪問是底效的。檢查一個每行上有三個列的鋸齒 數組時,每次訪問都要做兩個檢測 。在行0列3上的元素和在行1列3的元素沒有 任何關系。只有多維數組才可在以列方面上的訪問有一定的效率。過去,C和C++ 程序使用二維或多維數組時是把它們映射到一個一維數組上。對於老式的C和C++ 程序員,這樣的標記應該很清楚:

double num = MyArray[ i * rowLength + j ];

這個世界上的其它人可能更喜歡這樣:

double num = MyArray[ i, j ];

但,C和C++其實 並不支持多維數組。C#可以,而且對於多維數組的語法:當你創建一個真實的多 維數組時,對於編譯器和你來說意義都是很清楚的。創建多維數組時只用在熟悉 的一維數組標記上擴展一下就行了:

private int[ , ] _multi = new int[ 10, 10 ];

前面的申明創建了一個二維數組,而且是 10X10的100個元素。在多維數組上的每一維的長度總是一致的。編譯器利用這一 特性,可以創建更高效的代碼。初始化鋸齒數組時須要多次使用初始語句。而在 我前面的例子裡(譯注:指這裡:private int[] [] _jagged;),你須要5個語句 。更大的數組或者更多維的數組須要更多的初始代碼,而且你要手動編寫。然而 ,多維數組在初始化時只要指定多少維就行了。此外,多維數組在初始化元素時 更有效。以於值類型數組在初始化時是直接在有效的數組索引上包含該值,所有 的內容就是0。而引用類型的數組則是null。數組的數組在內層上都包含null引 用。

訪問多維數組時比訪問鋸齒數組要快得多,特殊是在列或者對角線 上訪問時。編譯器在數組的每個維上是使用的指針算法。鋸齒數組則要為每個一 維數組查找正確的(指針引用)值。

多維數組可以當成數組在很多情況下 使用。假設你創建一個棋盤游戲,你可能須要在一個格子上創建一個64個方格的 棋盤:

private Square[ , ] _theBoard = new Square[ 8, 8 ];

這個初始化創建了數組來存儲方格,假設這些方格是引用類型 ,這些方格自己還沒有創建,而且每個元素還是null。為了初始化每個元素,你 還要檢測數組上的每一維元素:

for ( int i = 0; i < _theBoard.GetLength( 0 ); i++ )
 for( int j = 0; j < _theBoard.GetLength( 1 ); j++ )
  _theBoard[ i, j ] = new Square( );

你你還有更靈活的方法來訪問多維數組,你可以給定 個別的元素索引來訪問該元素:

Square sq = _theBoard[ 4, 4 ];

如果你要迭代整個集合,你還可以使用迭代器:

foreach( Square sq in _theBoard )
 sq.PaintSquare( );

與鋸齒數組相比,你可能要這樣寫:

foreach( Square[] row in _theBoard )
 foreach( Square sq in row )
   sq.PaintSquare( );

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