1. 程式人生 > >C#複習——集合類(資料結構)

C#複習——集合類(資料結構)

常規的陣列存在侷限性:

  • 元素個數確定,只能建立已知大小。
  • 元素型別必須相同。
  • 只能通過索引訪問陣列。

在.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); 
}