C#複習——集合類(資料結構)
阿新 • • 發佈:2018-11-28
常規的陣列存在侷限性:
- 元素個數確定,只能建立已知大小。
- 元素型別必須相同。
- 只能通過索引訪問陣列。
在.NET框架中的常見集合型別有列表、佇列、棧以及雜湊表,即(Arraylist、Queue、stack、HastTable)。
ArrayList類
- 沒有固定大小
- 預設大小為16個元素,當新增到第17個元素時會自動擴充套件到32個
- 可以顯示的指定其容量
- 可以儲存不同型別的元素,因為其中所有元素都是object基本型別
- 常用方法
- Add(object) 把一個物件新增到 ArrayList 的末尾 。
- Insert(index,object) 在指定位置插入一個物件 。
- Remove(object) 移除一個物件 。
- RemoveAt(index) 移除一個物件。
- Clear() 移除所有元素 。
- Sort 對ArrayList 中的元素進行排序 。
int i = 100;
double d = 999.88d;
string s = "Hello World";
DateTime time = DateTime.Now;
ArrayList myList = new ArrayList();
myList.Add(i);
myList.Add(d);
myList.Add(s);
myList.Add(time);
myList. insert(0, 200);
myList.RemoveAt(0);
- ! 在從列表中取對應元素時,需要用到型別轉換,類似於裝箱拆箱:
int s = (int) myList[ 0 ];
HashTable類
- 由一對(key , value) 型別的元素組成的集合
- 所有元素的 key 必須唯一
- key ->value 是一對一的對映,即根據key就可 以立刻在集合眾找到所需元素
- 常用方法
- Add(key,value)
- 用key查詢而不是索引查詢,因此速度會很快
Hashtable ht = new Hashtable(); //建立HashTable
//增加物件
ht.Add("Beijing", "Sunny");
ht.Add("ShangHai", "Rainy");
ht.Add("Guandong", "Cloudy");
ht["Guandong"] = "Cloudy";//建立"Guandong"鍵值,Value取"Cloudy"。
//如果鍵值存在,value重新賦值
//若不存在,建立新物件,"Guandong"為鍵值,value為"Cloudy"。
//讀物件
string bjWeather = (string)ht["Beijing"];
//讀取時需要裝箱拆箱(型別轉換)
//其他用法
//ContainsKey方法
bool keyFound;
if(ht.ContainsKey(“Beijing”))
keyFound=true;
else
keyFound=false;
//列舉HashTable中的Keys
foreach(string key in ht.Keys)
{
MessageBox.Show(key);
}
//列舉HashTable中的Values
foreach(string value in ht.Values)
{
MessageBox.Show(value);
}
//列舉HashTable中的Keys和Values
foreach(DictionaryEntry de in ht)
{
MessageBox.Show(de.Key + " " + de.Values);
}
泛型集合
- 泛型,顧名思義就是泛泛的型別。即沒有確定的型別. 那麼沒有確定型別怎麼使用呢?
- 實際上,使用的時候規定型別即可了。集合,就是一種處理多個數據型別的類。而且一般你會在多個應用程式中使用同一個集合的多種不同的形式。你不須要每次依據草稿建立集合,而是使用泛型建立一個泛型類原型(prototype)。
- 在使用的時候,依據須要處理的資料型別。將List< T >尖括號裡的T換成相應的型別,並建立相應的例項就能夠使用了。
- 編譯時需要檢查型別約束,指定資料型別。
- 不需要裝箱拆箱操作。
- 名稱空間: System.Collections.Generic
- List< T >,Dictionary<K,V>
- < T >代表元素型別
- <K,V>同代表型別,K為鍵值型別,V為value型別
List< T >
- List< Student> students = new List< Student>();
- 利用List< Student>儲存班級集合,這種指定方式類似於vector
- 訪問方式與ArrayList相同
Student stu1 = students[2]; //使用索引訪問,無需型別轉換
stu1.SayHi(); //呼叫方法
Students.RemoveAt(0); //利用索引刪除
//List<Student>方式
foreach (Student stu in students)
{
Console.WriteLine(stu.Name);//呼叫成員
}
- 使用 .Sort()排序的時候遵循一定的規則
- +++++++++++++++++++++++++++++++++
- +++++++++++++++++++++++++++++++++//補充
前面說到了類似於ArrayList的List,下面還有類似於雜湊表Key、Value形式的泛型集合。
Dictionary<K,V>
- Dictionary<string,Student> students = new Dictionary<string,Student>();
- <K,V>約束集合中元素型別
- 編譯時檢查型別約束
- 無需裝箱拆箱操作
students.Add(scofield.Name, scofield);
…
student stu2 = students["周杰"];
…
students.Remove("周杰"); //索引都是通過**鍵值**來完成!!!
//Dictionary<string, Student> 方式
foreach (Student student in students.Values)
{
Console.WriteLine(student.Name);
}