ArrayList類
由於在使用時一個數組的長度不能預先知道或者可能在一個程序的生命周期中改變,靜態數組並不是很有用。此問題的一種解決方案是在程序中使用一種當超過默認的存儲空間時可以動態調整大小的數組。這類數組稱為ArrayList,位於.Net類庫的System.Collections下。
一個ArrayList對象有一個Capacity屬性存儲它的大小。這個屬性的初始值為16。當一個ArrayList中的元素數達到這個限制時,ArrayList自動添加Capacity屬性所表示的16個元素的存儲空間。在數組元素的數目可能變大變小的情況下使用ArrayList比使用標准數組的ReDim方法更有效率。
像我們在第一章討論過的那樣,一個ArrayList對象中存儲了object類型的對象。如果你需要以強類型方式存儲,你需要使用標准的數組或其它的數據結構。
ArrayList類的成員
ArrayList類包含了需要方法與屬性來使你可以方便的使用ArrayList。下面是一個最為常用的方法與屬性的列表。
Add(): 向ArrayList中添加一個元素。
AddRange(): 向ArrayList的尾部添加一些元素的集合
Capacity: ArrayList默認可以保存的元素的數目
Clear(): 移除ArrayList中的所有元素
Contains(): 判斷ArrayList中是否包含一個指定的項
CopyTo(): 拷貝一個ArrayList或者其中的一部分到另一個數組
Count: 返回ArrayList中當前元素的數目
GetEnumerator(): 返回一個枚舉器來迭代ArrayList
GetRange(): 取得ArrayList的一個子集作為一個新的ArrayList
IndexOf(): 返回與指定項目第一個匹配的索引
Insert(): 在ArrayList的指定索引處插入一個元素
InsertRange(): 由ArrayList的指定位置處開始插入一個元素的集合
Item: 屬性-指定索引處的元素
Remove(): 移除指定項目的第一個匹配
RemoveAt(): 移除指定索引處的元素
Reserve(): 將ArrayList中的元素反序排列
Sort(): 按字母順序排列ArrayList中的元素
ToArray(): 拷貝ArrayList的元素到一個數組
TrimToSize(): 設置Capacity屬性為ArrayList中的實際元素數
使用ArrayList類
ArrayList使用起來不想標准數組。通常,項目是使用Add方法添加到ArrayList中,除非有特殊原因,一個元素需要被添加到一個特殊位置,在這種情況下需要使用Insert方法。在這節中,我們來看一下怎樣使用ArrayList中零零總總的方法。
我們首先需要做的是按如下方式聲明一個這個類的對象:
ArrayList grades = new ArrayList();
注意在聲明中調用了構造函數。如果一個ArrayList不使用構造函數,在後續的程序語句中這個對象不可用。
對象使用Add方法添加一個對象到ArrayList。這個方法接受一個參數 – 一個要添加到ArrayList的對象。同時這個方法也返回一個整型表明元素被添加到的位置,雖然這個值在程序中不常用。下面是一些例子:
grades.Add(100);
grades.Add(84);
int position;
position = grades.Add(77);
Console.WriteLine("The grade 77 was added at position: " + position);
ArrayList中的對象可以使用一個foreach循環來顯示。ArrayList有一個內置的枚舉器管理ArrayList中所有對象的迭代,一次一個。下面的代碼片段展示了怎樣在ArrayList中使用一個foreach循環。
int total = 0;
double average = 0.0;
foreach (Object grade in grades)
total += (int)grade;
average = total / grades.Count;
Console.WriteLine("The average grade is: " + average);
如果你要在ArrayList的指定位置添加一個元素,你可以使用Insert方法。這個方法接受兩個參數:要插入元素的位置,及要插入的元素。下面的代碼片段在指定位置插入兩個分數,以保持ArrayList的對象的順序:
grades.Insert(1, 99);
grades.Insert(3, 80);
你可以通過調用Capacity屬性來查看一個ArrayList當前的容量,通過Count屬性來查看一個ArrayList中當前的元素數目:
Console.WriteLine("The current capacity of grades is: " + grades.Capacity);
Console.WriteLine("The number of grades in grades is: " + grades.Count);
由數組中移除項有幾種方式。如果你知道你要移除的項,但是不知道其所在的位置,你可以使用Remove方法。這個方法僅接受一個參數 – 要由ArrayList移除的對象。如果對象存在於ArrayList中,它將被移除。如果對象不再數組當中,將不會進行任何處理。當類似Remove的方法被調用時,其通常被放在一個If-Then語句內來調用,並使用方法(如Contains方法)驗證這個對象是否存在於ArrayList。下面是這個過程的示例代碼段:
if (grades.Contains(54))
grades.Remove(54);
else
Console.Write("Object not in ArrayList.");
如果你知道你要移除的對象的索引,你可以使用RemoveAt方法。這個方法接受一個參數-你要移除的對象的索引。唯一會引起的異常時 當你傳給方法一個無效的索引。方法工作方式如下:
grades.RemoveAt(2);
通過調用ArrayList的IndexOf方法你可以確定一個對象的位置。這個方法接受一個參數 – 待查找的對象,並返回對象在ArrayList中的位置。如果對象不在ArrayList中,該方法返回-1。一下代碼段展示了結合使用IndexOf方法與RemoveAt方法:
int pos;
pos = grades.IndexOf(70);
grades.RemoveAt(pos);
除了添加單個對象到ArrayList外,你也可以添加一個范圍的對象。這些對象須是存儲於一個實現ICollection接口的類型的對象當中。這意味著對象可以是存儲於一個數組,一個集合甚至是另一個ArrayList當中。
有兩種不同的方法可以添加一個范圍內的對象到ArrayList,分別是AddRange方法與InsertRange方法。AddRange方法添加一個范圍的對象到ArrayList的尾部,InsertRange方法添加一個范圍的對象到ArrayList中的指定位置。
下面的程序展示了這兩個方法的使用:
using System;
using System.Collections;
class class1 {
static void Main()
{
ArrayList names = new ArrayList();
names.Add("Mike");
names.Add("Beata");
names.Add("Raymond");
names.Add("Bernica");
names.Add("Jennifer");
Console.WriteLine("The original list of names: ");
foreach (Object name in names)
Console.WriteLine(name);
Console.WriteLine();
string[] newNames = new string[] { "David", "Michael" };
ArrayList moreNames = new ArrayList();
moreNames.Add("Terrill");
moreNames.Add("Donnie");
moreNames.Add("Mayo");
moreNames.Add("Clayton");
moreNames.Add("Alisa");
names.InsertRange(0, newNames);
names.AddRange(moreNames);
Console.WriteLine("The new list of names: ");
foreach (Object name in names)
Console.WriteLine(name);
}
}
這段程序的輸出如下:
David Michael Mike Bernica Beata Raymond Jennifer Terrill Donnie Mayo Clayton Alisa
由於指定的索引為0,前兩個名字被添加到ArrayList的起始位置,由於AddRange方法的使用後面的名字被添加到尾部。
另外兩個程序員認為有用的方法是ToArray方法與GetRange方法。GetRange方法返回一個ArrayList中指定范圍的對象到另一個ArrayList。ToArray方法拷貝ArrayList中所有元素到一個數組。首先我們看一下GetRange方法。
GetRange方法接受兩個參數:起始索引及要由ArrayList中檢索的元素的數目。GetRange方法是非破壞性的,即它僅僅是由原始ArrayList拷貝對象到新的ArrayList。下面例子展示了這是方法的作用,它使用了前文的程序:
ArrayList someNames = new ArrayList();
someNames = names.GetRange(2, 4);
Console.WriteLine("someNames sub-ArrayList: ");
foreach (Object name in someNames)
Console.WriteLine(name);
程序片段的輸出為:
Mike Bernica Beata Raymond
ToArray方法是你可以輕松的將ArrayList中的內容移動到一個標准數組中。你將使用ToArray方法的主要原因是使用數組可以獲得更快的訪問速度。
ToArray方法不接受參數,並將ArrayList中的元素返回到一個數組中。下面的例子展示了這個方法的使用:
Object[] arrNames;
arrNames = names.ToArray();
Console.WriteLine("Names from an array: ");
for (int i = 0; i <= arrNames.GetUpperBound(0); i++)
Console.WriteLine(arrNames[i]);
代碼段的最後一部分證明了ArrayList中的元素已經真實的被存儲在arrNames的數