IList 介面

IList 介面定義透過索引存取集合物件的方法, IList 實作 ICollection 與 IEnumerable介面成員,同時定義數個操作元素的方法成員,提供集合物件類似陣列元素的存取功能。

實作 IList 介面最重要的類別為 ArrayList 類別,它提供動態存取陣列物件的能力,接下來列舉說明其重要的方法成員。

Add

將一個object型別的物件 objEle加入到指定的集合物件,並且回傳一個整數資料型別數值,其代表這個物件被加入集合中的位置索引,使用這方法可以將任何型別的資料加入到指定的集合物件。
int Add (object objEle )
Insert

將一個物件objEle插入到指定的集合裏,其中第一個參數值intindex,即為物件所要插入的位置,當這個物件被插入的時候,於intindex 這個索引值以後的物件均會依序往後移動。
void Insert (int intindex , object objEle)
Remove

從一個指定的集合物件裏,移走其中第一個元素 objEle,當元素被移走之後,其後的元素則依序往前遞補。
void Remove(object objEle)
RemoveAt

將集合物件裏,指定索引位置intindex上的元素移除。
void RemoveAt(int intindex)
Contains

這個方法回傳一個布林型別的資料值,表示集合中是否含有參數objEle物件,有的話為true,否則為false。
bool Contains (object objEle)
Clear

引用這個方法,將會刪除集合物件中的所有元素。
Void Clear()
IndexOf

回傳物件於objEle集合中的位置索引,若是集合中找不到這個物件,則回傳一個-1的值。
int IndexOf (object objEle)
從 IList 介面的方法說明中,你可以發現它最大的特色在於提供類似陣列索引的存取機制,無論如何,實作IList介面最重要的類別為 ArrayList ,這是一種動態版本的陣列集合,下一節我們針對這個類別作說明。

ArrayList


建構式包含了三個覆寫版本,最簡單的版本沒有接受任何參數,以此版本建立的 ArrayList物件,容量會自動被設定為 16 ,另外一個建構式則接受一個指定初始容量值的參數,定義如下:
public ArrayList(int intCapacity)
其中的 intCapacity 為所要初始化的容量大小。

ArrayList 類別實作了 IList 、 ICollection 、 IEnumerable 以及 Icloneable 等數個介面,因此同時實作了這些介面所定義的方法成員,以下的範例說明如何建立一個 ArrayList 類別物件,利用其定義的方法以及屬性成員,進行 ArrayList 集合物件的元素存取操作。

ArrayList 類別提供另一個方法 Insert ,支援特定位置的新成員插入。

以下建立一個類別作為ArrayList集合物件示範說明。
// ArrayListDemo

public class KTObject
{
    int _id;
    public KTObject(int id)
    {
        _id = id;
    }
    public int GetID
    {
        get
        {
            return _id;
        }
    }
}
KTObject 類別建構式接受一個 int 型別的參數 id,將其值指定給變數 _ id ,另外定義唯讀屬性 GetID ,回傳 _id 變數值,作為此物件的識別編號。

在主程式中,首先建立一個方法 WriteList ,這個方法接受 ArrayList 參數 list ,內容如下:
void WriteList(ArrayList list)
{
    int size = list.Count;
    Console.WriteLine("以下為陣列物件內含元素 : ");
    for (int i = 0; i < size; i++)
    {
        KTObject o = (KTObject)list[i];
        Console.Write(o.GetID + ",");
    }
    Console.WriteLine("容量 = {0},物件數目={1}\n",
                     list.Capacity, size);
}
一開始引用類別 ArrayList 的屬性 Count ,取得參數 list 內含的物件數目,並將其指定給變數 pSize ,接下來的 for 迴圈敘述,依序取得 list 參數內含物件,並將其鑄型為 KTObject 型別,引用 GetID取得物件識別編號逐一輸出,顯示參數 list 儲存的物件元素。

接下來在主程式中引用此方法逐一輸出指定的 ArrayList 物件元素。
class Program
{
    static void Main(string[] args)
    {
        Program program = new Program();
        ArrayList arrayList = new ArrayList();

        Console.WriteLine("arrayList 初始容量 = {0} \n",arrayList.Count);
        Console.WriteLine
            ("引用方法 Add 依次插入物件並且指定其物件 ID 分別為 0~14 ");
        for (int i = 0; i < 15; i++)
        {
            arrayList.Add(new KTObject(i));
        }
        program.WriteList(arrayList);
        Console.WriteLine
            ("引用方法 INSERT 分別於位置索引 8 以及 16 插入物件指定其物件ID 分別為 17  以及 20 ");

        arrayList.Insert(8, new KTObject(17));
        arrayList.Insert(16, new KTObject(20));
        program.WriteList(arrayList);

        Console.WriteLine
            ("引用方法 Remove 分別移走於位置索引 10 以及第二個加入的物件 ");

        arrayList.Remove(arrayList[2]);
        arrayList.RemoveAt(10);
        program.WriteList(arrayList);

        Console.WriteLine("引用方法 Reverse 逆轉物件排列順序 ");
        arrayList.Reverse();
        program.WriteList(arrayList);

        Console.WriteLine("複製一個新的 ArrayList 物件 arrayList1 ");
        ArrayList arrayList1 = (ArrayList)arrayList.Clone();
        program.WriteList(arrayList1);
        Console.ReadLine();
    }
}
一開始建立 ArrayList 集合物件 arrayList ,引用 Count 屬性取得內容的初始容量值並且輸出,從這個結果可以看到初始容量的值。 接下來的 for 迴圈逐次加入 15個新建立的 KTObject 物件,於建立物件的建構式傳入每次的迴圈次數,當作 ObjectElement 物件的識別 ID。

後續的程式碼,分別引用各種方法進行物件元素的操作,然後將操作結束的 arrayList 傳入 WriteList 以檢視結果。 Insert 方法分別於索引值等於 8 以及 16 的位置插入物件,並且指定其物件 ID 為 17 以及 20 。 引用Remove 方法移走索引位置上的第 3 個物件,並引用 RemoveAt 移走索引位置等於 10 的物件。

 最後引用方法 Reverse 將陣列中的物件元素作反轉排列, 引用 Clone 將整個集合物件複製成為另一個 ArrayList 類別物件陣列。
arrayList 初始容量 = 0

引用方法 Add 依次插入物件並且指定其物件 ID 分別為 0~14
以下為陣列物件內含元素 : 
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,容量 = 16,物件數目=15

引用方法 INSERT 分別於位置索引 8 以及 16 插入物件指定其物件ID 分別為 17  以及 20
以下為陣列物件內含元素 : 
0,1,2,3,4,5,6,7,17,8,9,10,11,12,13,14,20,容量 = 32,物件數目=17

引用方法 Remove 分別移走於位置索引 10 以及第二個加入的物件
以下為陣列物件內含元素 : 
0,1,3,4,5,6,7,17,8,9,11,12,13,14,20,容量 = 32,物件數目=15

引用方法 Reverse 逆轉物件排列順序
以下為陣列物件內含元素 : 
20,14,13,12,11,9,8,17,7,6,5,4,3,1,0,容量 = 32,物件數目=15

複製一個新的 ArrayList 物件 arrayList1
以下為陣列物件內含元素 : 
20,14,13,12,11,9,8,17,7,6,5,4,3,1,0,容量 = 15,物件數目=15
以上為輸出結果,請自行比對程式碼即可。

方法 Sort 與物件排序


ArrayList 類別提供的另一個重要方法 Sort ,此方法被應用於排列 ArrayList 集合中物件的大小,其形式如下:
public virtual void Sort();
Sort 透過集合中每個元素的 IComparable 介面實作功能,支援 ArrayList 中元素的排序作業, IComparable 定義了集合中比較兩個物件大小的方法。
class Program
{
    static void Main(string[] args)
    {
        ArrayList arrayList = new ArrayList();
        arrayList.Add(10);
        arrayList.Add(20);
        arrayList.Add(15);
        arrayList.Add(5);
        arrayList.Add(30);

        Console.WriteLine("\n排序前的陣列內容 !!");
        Program program = new Program();
        program.WriteList(arrayList);

        Console.WriteLine("\n排序後的陣列內容 !!");
        arrayList.Sort();
        program.WriteList(arrayList);
        Console.ReadKey();
    }
    void WriteList(ArrayList list)
    {
        Console.WriteLine();
        int pSize = list.Count;
        for (int i = 0; i < pSize; i++)
        {
            Console.Write(list[i] + "\t");
        }
        Console.WriteLine();
    }
}
首先建立一個 ArrayList 類別物件 arrayList ,並依序加入 5 個整數值,分別是 10 、 20 、 15 、 5 以及 30 ,引用 WriteList 將其中的內容輸出。 接下來引用 ArrayList 類別所提供的排序方法 Sort ,此方法依大小重新排序集合中的物件,再度引用WriteList 將排序後的內容輸出。
排序前的陣列內容 !!

10      20      15      5       30

排序後的陣列內容 !!

5       10      15      20      30
以上執行結果顯示了集合經過排列後,與原先的排列結果比較。

沒有留言: