1. 程式人生 > >5.C#集合與陣列

5.C#集合與陣列

一、陣列的定義

Array

也就是陣列。

具體表示方法是:資料型別[維數] 陣列名=new 資料型別[]

陣列有很多的優點,比如說陣列在記憶體中是連續儲存的,所以它的索引速度是非常的快,而且賦值與修改元素也很簡單,

比如:

  //宣告一個一維陣列

 intArray1 = new int[3];

//初始化一個一維陣列

intArray1 = new int[3]{1,2,3};

intArray1 = new int[]{1,2,3};

//賦值

s[0]="a";

s[1]="b";

s[2]="c";

//修改

s[1]="b1";

//宣告一個二維陣列

int[,] cells=int[3,3];  

int[,] cells={{1,0,2},{1,2,0},{1,2,1}};      //初始化一個二維整數陣列     

但是,陣列也存在一些不足的地方。比如在陣列的兩個資料間插入資料也是很麻煩的。還有我們在宣告陣列的時候,必須同時指明陣列的長度,陣列的長度過長,會造成記憶體浪費,陣列和長度過短,會造成資料溢位的錯誤。這樣如果在宣告陣列時我們並不清楚陣列的長度,就變的很棘手了。 針對於陣列的這些缺點,C#中最先提供了ArrayList物件來克服這些缺點。 

適應於知道陣列長度並且在使用過程中不需要插入元素的情況。

ArrayList

動態陣列,用法似乎跟c++的vector有點像。使用ArrayList必須引用Collections類。

用於資料儲存和檢索的專用類。它的大小是按照其中儲存的資料來動態擴充與收縮的。所以,我們在宣告ArrayList物件時並不需要指定它的長度。

ArrayList繼承了IList介面,所以它可以很方便的進行資料的新增,插入和移除。比如:

ArrayList list = new ArrayList(); //新增資料

list.Add("abc"); list.Add(123); //修改資料

list[2] = 345; //移除資料

list.RemoveAt(0); //插入資料

list.Insert(0, "hello world");

新增

  • Add(a) 新增元素a到末尾;
  • Insert(b,a) 在位置b插入元素a;
  • InsertRange(b,a) 在位置b插入集合a;

刪除

  • Remove(a) 移除元素a;
  • RemoveAt(a) 移除位置a的元素;
  • RemoveRange(a,b) 移除位置a到位置b的元素;
  • Clear() 清空;

排序 Sort();

反轉 Reverse();

查詢

  • IndexOf(a) 返回元素a的位置,沒有則返回-1;
  • Contains(a) 檢測是否含有元素a,返回true/false;

從上面示例看,ArrayList好像是解決了陣列中所有的缺點,在list中,我們不僅插入了字串"abc",而且又插入了數字123。這樣在ArrayList中插入不同型別的資料是允許的。因為ArrayList會把所有插入其中的資料都當作為object型別來處理。這樣,在我們使用ArrayList中的資料來處理問題的時候,很可能會報型別不匹配的錯誤,也就是說ArrayList不是型別安全的。

既使我們保證在插入資料的時候都很小心,都有插入了同一型別的資料,但在使用的時候,我們也需要將它們轉化為對應的原型別來處理。這就存在了裝箱與拆箱的操作,會帶來很大的效能損耗。

穿插一下裝箱與拆箱的概念: 簡單的來講: 裝箱:就是將值型別的資料打包到引用型別的例項中 比如將int型別的值123賦給object物件o int i=123; object o=(object)i; 拆箱:就是從引用資料中提取值型別 比如將object物件o的值賦給int型別的變數i object o=123; int i=(int)o; 裝箱與拆箱的過程是很損耗效能的。

二、理解泛型與非泛型的概念

1、BCL中集合型別分為泛型集合與非泛型集合。

2、非泛型集合的類和介面位於System.Collections名稱空間。

3、泛型集合的類和介面位於System.Collections.Generic名稱空間。

同傳統的集合相比,泛型集合是一種強型別的集合,它解決了型別安全問題,同時避免了集合中每次的裝箱與拆箱的操作,提升了效能。

       1. List,這是我們應用最多的泛型種類,它對應ArrayList集合。

  2. Dictionary,這也是我們平時運用比較多的泛型種類,對應Hashtable集合。

  3. Collection對應於CollectionBase

  4. ReadOnlyCollection 對應於ReadOnlyCollectionBase,這是一個只讀的集合。

  5. Queue,Stack和SortedList,它們分別對應於與它們同名的非泛型類。

三、集合的定義

C#2.0後出現了List。

泛型集合:           ①List

List names = new List();

names.Add("喬峰");

names.Add("歐陽峰");

names.Add("馬蜂");

foreach (string name in names)

{

Console.WriteLine(name);

}

//向List中插入元素

names.Insert(2, "張三峰");

//移除指定元素

names.Remove("馬蜂"); 

②Dictionary

System.Collections.DictionaryEntry dic=new System.Collections.DictionaryEntry("key1","value1");

Dictionary fruit = new Dictionary(); //加入重複鍵會引發異常

fruit.Add(1, "蘋果");

fruit.Add(2, "桔子");

fruit.Add(3, "香蕉");

fruit.Add(4, "菠蘿"); //因為引入了泛型,所以鍵取出後不需要進行Object到int的轉換,值的集合也一樣

foreach (int i in fruit.Keys) {

Console.WriteLine("鍵是:{0} 值是:{1}",i,fruit);

}

//刪除指定鍵值

fruit.Remove(1);

//判斷是否包含指定鍵

if (fruit.ContainsKey(1)) {

Console.WriteLine("包含此鍵");

}

//清除集合中所有物件

fruit.Clear(); 

SortedList類 與雜湊表類似,區別在於SortedList中的Key陣列排好序的 

Stack類 棧,後進先出。push方法入棧,pop方法出棧。

Queue類 佇列,先進先出。enqueue方法入佇列,dequeue方法出佇列。 

非泛型集合:

①Hashtable

Hashtable abc = new Hashtable();            

abc.Add("1", "34");            

if (abc.Contains("1"))            

{                

Response.Write(abc["1"]);            

②Queue

System.Collections.Queue queue=new System.Collections.Queue();

queue.Enqueue(1);

queue.Enqueue(2);

System.Console.WriteLine(queue.Peek());

while(queue.Count>0) {

System.Console.WriteLine(queue.Dequeue());

}

③SortedList

System.Collections.SortedList list=new System.Collections.SortedList();

list.Add("key2",2);

list.Add("key1",1);

for(int i=0;i0) {

System.Console.WriteLine(stack.Pop());