“哪種集合是最好的?”答案是:“視情況而定。” 不同的集合有不同的性能,而且在不同的行為上有不同的優化。.Net框架支持很 多類似的集合:鏈表,數組,隊列,棧,以及其它的一些集合。C#支持多維的數 組,它的性能與一維的數組和鋸齒數組都有所不同。.Net框架同樣包含了很多特 殊的集合,在你創建你自己的集合類之前,請仔細參閱這些集合。你可以發現很 多集合很快,因為所有的集合都實現了ICollection接口。在說明文檔中列出了 所有實現了ICollection接口的集合,你將近有20多個集合類可用。
為了 選擇適合你使用的集合,你須要考慮在該集合上使用的操作。為了創建一個有伸 縮性的程序,你須要使用一些實現了接口的集合類,這樣當你發現某個假設的集 合不正確時,你可以用其它不同的集合來代替它(參見原則19)。
.Net框 架有三種不同類型的集合:數組,類似數組的集合,以及基於散列值的集合。數 組是最簡單的也是一般情況下最快的集合,因此我們就從它開始。這也是你經常 要使用到的集合類。
你的第一選擇應該經常是System.Array類,確切的 說,應該是一個數組類型的類。 選擇數組類的首要原因,也是最重要的原因是 數組是類型安全的。所有其它集合都是存儲的System.Object引用,直到C#2.0才 引入了范型(參見原則49)。當你申明一個數組時,編譯器為你的類型創建一個特 殊的System.Array派生類。例如:這樣創建了申明並創建了一個整型的數組:
private int [] _numbers = new int[100];
這個 數組存儲的是整型,而不是System.object的引用。這很重要,因為你在一個數 組上添加,訪問,刪除值類型時,可以避免裝箱與拆箱操作的性能損失(參見原 則17)。上面的初始化操作創建了一個一維的數組,裡面存放了100個整數。所有 被數組占用的內存都被清0了。值類型數組都是0,而引用數組都是null。所有在 數組裡的元素可以用索引訪問:
int j = _numbers[ 50 ];
另外,訪問數組時還可以用foreach迭代,或者使用枚舉器:
foreach ( int i in _numbers )
Console.WriteLine( i.ToString( ) );
// or:
IEnumerator it = _numbers.GetEnumerator( );
while( it.MoveNext( ))
{
int i = (int) it.Current;
Console.WriteLine( i.ToString( ) );
}
如果准備存儲單一次序的對象,你應該使用數組。但 實際上你的數據結構往往比這復雜的多。這很快誘使我們回到了C風格上的鋸齒 數組,那就是一個數組裡存儲另一個數組。有些時候這確實是你想要的,每個外 層元素都是內層的一個數組:
public class MyClass
{
// Declare a jagged array:
private int[] [] _jagged;
public MyClass()
{
// Create the outer array:
_jagged = new int[5][];
// Create each inner array:
_jagged[0] = new int[5];
_jagged[1] = new int[10];
_jagged[2] = new int[12];
_jagged[3] = new int[7];
_jagged[4] = new int[23];
}
}