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());
}