程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> (教學思路 C#集合一)集合的概述、動態數組ArrayList(8)

(教學思路 C#集合一)集合的概述、動態數組ArrayList(8)

編輯:關於C語言

通過以上的例子你們應該已經理解集合的方法,我們再來總結一下集合ArrayList相比數組有什麼好處?主要是它可以根據使用大小按需動 態增加,不用受事先設置大小的控制,還有就是可以隨意的添加、插入或移除某一范圍元素,比數組要方便。但是它也有不足,ArrayList 不 管對象是什麼類型都會添加到集合j中,在編譯時都是沒有問題的,但是在遍歷的時候,為防止集合中元素的類型不一致,所以最好使用object 類型來接收遍歷j的元素,如foreach(object i in j)這樣就能減少錯誤,可能同學們會想,用object類型我們記住了,怎麼就成弊端的呢?

這裡我們就要學到另一個知識點,就是裝箱和拆箱。所謂裝箱就是把值類型打包成object引用類型的一個實例中,也就是說在進行裝箱的時 候,必須分配並構造一個全新的對象。而拆箱就是指從對象中提取值類型,將object類型強制轉換為原類型。

比如:

ArrayList j=new ArrayList();

j.Add(123);

j.Add("123");

在添加時,ArrayList是會隱式的將整形的123 進行如下裝箱操作: int i=123; object o=(object)i;也就是說存進j的元素都將變成 object類型

而在使用這個整形的123時,ArrayList又會進行如下的拆箱操作: o=123; i=(int)o; 也就是將o再強制轉換成原來的類型表現出去

想想這將是很大的性能消耗,需要進行大量的計算,至於怎麼記住裝箱拆箱,我們就把這個過程想象成現實生活中,你買了很多中水果(元 素),為了方便搬運,我們把他們都放到一個大盒子(集合對象)裡,但是因為有榴蓮,我們又得把榴蓮(值類型元素)單獨包裝好(裝箱過 程)再放到盒子裡,到了家後,我們要打開盒子取出水果,在拿到榴蓮時,要想見到真正的榴蓮,我們就的把包裝去掉(拆箱),我們馬上就 聞到了榴蓮那獨有的味道了(變回原類型)。哎!這個過程多麻煩呀!分了這麼多步,在C#2.0出來後,就推出了新的技術來解決這個問題,那 就是泛型,以後的章節我會講解這個新特性。

下面我們來講一下ArrayList向數組的互換。

將數組轉換成動態數組

1 //數組轉換成動態數組
2 int[] c = { 1, 2 };
3 //1.利用for循環添加到動態數組中
4 ArrayList d = new ArrayList();
5 for (int i = 0; i < c.Length; i++)
6 {
7 d.Add(c[i]);
8 }
9 //2.使用Adapter方法,將數組打包到動態數組中
10 ArrayList b = ArrayList.Adapter(c);
11 foreach (int i in b)
12 {
13 Console.WriteLine(i);
14 }

動態數組轉換成數組

1 //動態數組轉換成數組
2 ArrayList arl = new ArrayList(4);
3 arl.Add ("W");
4 arl.Add("h");
5 arl.Add("y");
6 //arl.Add(1);
7 //只能將包含同一種數據類型集合轉換成這種類型的數組
8 //如果ar1中a添加了元素整型 1,將無法被轉換為string類型的數組
9 string[] ar = new string[arl.Count];
10
11 //使用typeof (string)限定放入數組ar中的數據都是string類型,
12 //同時再將arl強制轉換string類型數組,賦給數組ar
13 ar = (string[])arl.ToArray(typeof(string));
14 foreach (string a in ar)
15 {
16 Console.Write(a);
17 }

例題:

1 ArrayList al = new ArrayList();//定義一個動態數組
2 Random rd = new Random();//定義一個隨機數對象
3 do
4 {
5 int i = rd.Next(1, 36);//在1-35中產生隨機數
6 if (!al.Contains (i))//如果al不包含隨機數i
7 al.Add(i);//我們就把i添加到動態數組中
8 } while (al.Count < 7);//當動態數組的長度是7的時候,我們停止添加。
9 al.Sort();//排序一下動態數組
10 foreach (object cps in al)
11 Console.WriteLine(cps);//把這7個數用foreach循環打印出來

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