C#中4個常用的集合
1.ArrayList
ArrayList類似於數組,有人也稱它為數組列表。ArrayList可以動態維護,而數組的容量是固定的。
它的索引會根據程序的擴展而重新進行分配和調整。和數組類似,它所存儲的數據稱為元素,它所保存的元素數就是它的容量。默認初始容量為0,在使用它時,需引入命名空間System.Connections;以下代碼可以定義一個ArrayList:
using System.Collections;
//創建容量為0的ArrayList對象
ArrayList myList = new ArrayList();
//創建容量為5的ArrayList對象
ArrayList myList = new ArrayList(5);
//獲取對象中實際包含的元素數
int num = myList.Count();
ArrayList通過Add()方法添加元素,其方法返回一個Int類型的值,這個值代表所添加的元素在集合中的索引。
參數:如果向ArrayList中添加的元素是值類型,那么這些元素就會自動裝箱處理轉換為Object引用類型,然后保存,所以ArrayList中的所有元素都是對象的引用。
刪除ArrayList中的元素有三種方法,分別為:
對象名.RomoveAt(int index);
對象名.Romove(Object value);
對象名.Clear();(這種方法會將集合中的所有元素刪除,俗稱"清空"~~~)
2.HashTable
C# /提供了一種稱為HashTable的數據結構,通常稱為哈希表,有的人稱它為"字典".HashTable的數據是通過鍵(Key)和值(Value)來組織的,同ArrayList一樣,它也屬於System.Collections命名空間中,它所存放的每個元素都是鍵/值對.以下為HashTable的常用方法和屬性:
屬性名稱:Count
屬性名稱:Keys
屬性名稱:Values 說明: 獲取包含在HashTable中值的集合
方法名稱:Add(Object key,Object Value)
方法名稱:Remove(Object Key)
方法名稱:Clear()
和ArrayList不同,訪問HashTable元素時可以直接通過鍵名來獲取具體值,同樣,由於值類型是Object.所以當得到一個值時也需要通過類型轉換得到指定類型的對象.
3. 泛型集合: List<T>
泛型是C#2.0中的一個新特性。泛型引入了一個新概念:類型參數。通過使用類型參數(T),減少了運行時強制轉換成裝箱操作的風險。通過泛型集合可以最大限度的重用代碼、保護類型的安全及提高性能。
定義一個 List<T>泛型集合的方法如下:
List<T> 對象名 = new List<T>();
List<T>添加元素、獲取元素、刪除元素以及遍歷和ArrayList用法都是類似的,但 List<T>保障了類型的安全性。在獲取元素時無需進行類型轉換.下面我們把List<T>和ArrayList作以比較
不用點:List<T>對所保存元素做類型約束,而ArrayList可以增加任意類型。添加、讀取值類型元素 List<T>無需拆箱裝箱,而ArrayList需要做拆箱、裝箱處理。
相同點:通過索引訪問集合中的元素,添加、刪除元素方法相同
4.泛型集合Dictionary<K,V>
它具有泛型的全部特性,編譯時檢查類型約束,獲取元素時無需類型轉換,並且它存儲數據的方式和HashTable類似。也是通過Key/Value對元素保存的。定義語法為:
Dictionary<K,V>對象名 = new Dictionary<K,V>
<K,V>中的K表示集合中Key的類型,V表示Value的類型,它的含義和List<T>是相同的.例如:
Dictionary<string,SE> engineers = new Dictionary<string,SE>();
在這個集合中,Key類型是string類型,Value是SE類型。 下面我們把 Dictionary<K,V> 和HashTable作以比較:
不同點: Dictionary<K,V>對所保存的元素做類型約束,而HashTable可以增加任何類型。 Dictionary<K,V>添加、讀取值類型元素無需拆箱、裝箱,而HashTable需要做拆箱、裝箱處理
相同點:通過Key獲取Value, 添加、刪除、遍歷元素方法相同
C#中四種集合的運用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; using System.Diagnostics; namespace C_中四種集合的運用 { class Program { static void Main(string[] args) { ArrayList array = new ArrayList();//實例化一個ArrayList集合對象 Hashtable hashtable = new Hashtable();//實例化一個HashTable集合對象 List<Student> list = new List<Student>();//實例化一個List<>集合對象 Dictionary<string, Student> dictionary = new Dictionary<string, Student>();//實例化一個Directory<>集合對象 Student Zhang = new Student("張三", '男', 22); Student Li = new Student("李四", '女', 20); //實例化3個Student對象 Student Sun = new Student("小五", '女', 21); Stopwatch sw = new Stopwatch(); sw.Start(); Console.WriteLine(" 使用ArrayList 集合 "); array.Add(Zhang); array.Add(Li); //用ArrayList的對象名添加Student對象 array.Add(Sun); Console.WriteLine("**********使用For循環遍歷**********"); for (int i = 0; i < array.Count; i++) { Student stu = (Student)array[i]; Console.WriteLine("我的姓名是{0},年齡是{1},性別是{2}", stu.Name, stu.Age, stu.Sex); } Console.WriteLine(); Console.WriteLine("刪除Student張三的信息"); array.Remove(Zhang);//用對象名刪除元素 Console.WriteLine("\n***********使用Foreach循環遍歷一***********"); foreach (Student item in array) { Console.WriteLine("我的姓名是{0},年齡是{1},性別是{2}", item.Name, item.Age, item.Sex); } Console.WriteLine("\n***********使用Foreach循環遍歷二***********"); foreach (Student item in array) { Student stu = (Student)item; Console.WriteLine("我的姓名是{0},年齡是{1},性別是{2}", stu.Name, stu.Age, stu.Sex); } Console.WriteLine("\n***********使用Foreach循環遍歷三***********"); foreach (var item in array) { Student stu = (Student)item; Console.WriteLine("我的姓名是{0},年齡是{1},性別是{2}", stu.Name, stu.Age, stu.Sex); } Console.WriteLine(); Console.WriteLine(" 使用HashTable集合"); hashtable.Add("張三", Zhang); hashtable.Add("李四", Li);// hashtable.Add("小五", Sun); Console.WriteLine("刪除Student李四的信息"); hashtable.Remove("李四");//用鍵(key)移除元素 Console.WriteLine("\n***********使用Foreach循環遍歷集合的所有值一***********"); foreach (Student item in hashtable.Values)//循環遍歷集合的值 { Console.WriteLine("我的姓名是{0},年齡是{1},性別是{2}", item.Name, item.Age, item.Sex); } Console.WriteLine("\n***********使用Foreach循環遍歷集合的所有值二***********"); foreach (Student item in hashtable.Values)//循環遍歷集合的值 { Student stu = (Student)item; Console.WriteLine("我的姓名是{0},年齡是{1},性別是{2}", stu.Name, stu.Age, stu.Sex); } Console.WriteLine("\n***********使用Foreach循環遍歷集合的所有值三***********"); foreach (var item in hashtable.Values)//循環遍歷集合的值 { Student stu = (Student)item; Console.WriteLine("我的姓名是{0},年齡是{1},性別是{2}", stu.Name, stu.Age, stu.Sex); } Console.WriteLine(); Console.WriteLine("***********使用Foreach循環遍歷Name值******"); foreach (string Name in hashtable.Keys)//循環遍歷集合的鍵(key) { Console.WriteLine("我的姓名是{0}", Name); } Console.WriteLine(); Console.WriteLine(" 使用List<>集合"); list.Add(Zhang); list.Add(Li); //為List<>集合添加元素 list.Add(Sun); Console.WriteLine("***********使用Foreach循環遍歷***********"); list.Remove(Sun);//移除集合元素Sun的信息 foreach (var item in list) { Console.WriteLine("我的姓名是{0},年齡是{1},性別是{2}", item.Name, item.Age, item.Sex); } Console.WriteLine(); list.RemoveAt(0);//移除集合中索引為0的元素 Console.WriteLine("***********使用For循環遍歷*********"); for (int i = 0; i < list.Count; i++) { Console.WriteLine("我的姓名是{0},年齡是{1},性別是{2}", list[i].Name, list[i].Age, list[i].Sex); } Console.WriteLine(); Console.WriteLine(" 使用Directory<>集合"); dictionary.Add("張三", Zhang); dictionary.Add("李四", Li); //為Directory<>集合添加元素 dictionary.Add("小五", Sun); Console.WriteLine("*************使用Foreach循環遍歷***********"); foreach (var item in dictionary.Values) { Console.WriteLine("我的姓名是{0},年齡是{1},性別是{2}", item.Name, item.Age, item.Sex); } Console.WriteLine(); dictionary.Remove("李四");//移除集合中李四的信息 Console.WriteLine("************使用Foreach循環遍歷Name值******"); foreach (string Name in dictionary.Keys) { Console.WriteLine("我的姓名是{0}", Name); } sw.Stop(); Console.WriteLine("時間:{0}", sw.ElapsedMilliseconds); Console.ReadLine(); } } } //--------------------------Student----------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace C_中四種集合的運用 { public class Student { public Student() { } public Student(string name, char sex, int age) { this.Name = name; this.Sex = sex; this.Age = age; } public string Name { get; set; } public char Sex { get; set; } public int Age { get; set; } } }
另:如何選擇集合類型??
在.NET Framework中提供了很多集合類,如ArrayList、Hashtable、SortedList、ListDictionary、Queue、NameValueCollection、List<T>、Dictionary<TKey,TValue>及數組等,要了解各個集合的特性,選擇合適的集合。
在所有的集合中數組是性能最高的,如果要存儲的數據類型一致和容量固定,特別是對值類型的數組進行操作時沒有裝箱和拆箱操作,效率極高。
在選擇集合類型時應考慮幾點:
(1)集合中的元素類型是否是一致的,比如集合中將要存儲的元素都是int或者都是string類型的就可以考慮使用數組或者泛型集合,這樣在存儲數值類型元素就可以避免裝箱拆箱操作,即使是引用類型的元素也可以避免類型轉換操作。
(2)集合中的元素個數是否是固定的,如果集合中存儲的元素是固定的並且元素類型是一致的就可以使用數組來存儲。
(3)將來對集合的操作集中在那些方面,如果對集合的操作以查找居多可以考慮HashTable或者Dictionary<TKey,TValue>這樣的集合,因為在.NETFramework中對這類集合采用了特殊機制,所以在查找時比較的次數比其它集合要少。
另外,在使用可變集合時如果不制定初始容量大小,系統會使用一個默認值來指定可變集合的初始容量大小,如果將來元素個數超過初始容量大小就會先在內部重新構建一個集合,再將原來集合中的元素復制到新集合中,可以在實例化可變集合時指定一個相對較大的初始容量,這樣在向可變集合中添加大量元素時就可以避免集合擴充容量帶來的性能損失。
System.Collections 命名空間包含接口和類,這些接口和類定義各種對象(如列表、隊列、位數組、哈希表和字典)的集合。
System.Collections.Generic 命名空間包含定義泛型集合的接口和類,泛型集合允許用戶創建強類型集合,它能提供比非泛型強類型集合更好的類型安全性和性能。
System.Collections.Specialized 命名空間包含專用的和強類型的集合,例如,鏈接的列表詞典、位向量以及只包含字符串的集合。
數組
數組是大部分編程語言中都支持的一種數據類型,無論C語言、C++還是C#以及Java
都支持數組的概念。
數組是具有同一類型的多個對象的集合,是一種數據結構,包含同一類型的多個元素。數組是一組具有相同類型的變量的集合,如一組整數、一組字符等。組成數組的這些變量稱為數組的元素。每個數組元素都有一個編號,這個編號叫做下標,C#中的下標是從0開始的,最大的下標等於數組元素個數減一。C#中可以通過下標來區別這些元素。數組元素的個數有時也稱之為數組的長度。
數組類型從類型System.Array繼承而來。System.Array類表示所有的數組,不論這些數組的元素類型或秩如何。對數組定義的操作有:根據大小和下限信息分配數組;編制數組索引以讀取或寫入值;計算數組元素的地址;以及查詢秩、邊界和數組中存儲的值的總數。
1、 數組是固定大小的,不能伸縮。雖然System.Array.Resize這個泛型方法可以重置數組大小,但是該方法是重新創建新設置大小的數組,用的是舊數組的元素初始化。隨后以前的數組就廢棄!而集合卻是可變長的。
2、 數組要聲明元素的類型,集合類的元素類型卻是object。
3、 數組可讀可寫,不能聲明只讀數組。集合類可以提供ReadOnly方法以只讀方式使用集合。
4、 數組要有整數下標才能訪問特定的元素,然而很多時候這樣的下標並不是很有用。集合也是數據列表卻不使用下標訪問。很多時候集合有定制的下標類型,對於隊列和棧根本就不支持下標訪問!
1. 定義
一個數組的定義中包含以下幾個要素:
Ø 元素類型(相同)
Ø 數組的維數(初始化時必須給定)
Ø 每個維數的上下限
首先,給定類型的數組只能保存該類型的元素。其次要規定數組的維數,可以用幾何的知識理解數組的維數,可以用一維坐標軸來理解一維數組;用平面直角坐標系來理解二維數組;用三維立體坐標系來理解三維數組等。再次,數組必須規定每個維數的大小。
如:
int[] anIntArray; //定義數組
anIntArray={1,2,3};//上述代碼定義了一個數組並對其進行了初始化。可以一次完成
int [] sz=newint[]; //初始化數組,如果不指定大小,報語法錯誤。
anIntArray=new int[]{1,2,3};//用new關鍵字初始化數組的元素
anIntArray=new int[3]{1,2,3};//指定數組大小用new關鍵字初始化數組元素
數組還有另外一種初始化方式,即指定數組大小並用new關鍵字初始化數組的元素:
int[] anIntArray=new int[3];
執行時.NET將會為數組中的每一個元素賦予同一個(定義類型的)默認值。對於Int型的變量來說這個默認值是0。
2、數組的索引
數組的索引也就是通常所說的數組下標,英文為Index。數組的索引是從0開始的。
3、數組的遍歷
C#提供了foreach語句以實現數組的遍歷功能。可以使用foreach語句訪問數組中的每個元素而不需要確切地知道每個元素的索引。
int[] myArray=new int[5] {14, 25, 7,36, 53};
//采用foreach語句對myArray進行遍歷
foreach(int number inmyArray)
Console.Write(number);
for (int i= 0; i < 5; i++)
Console.Write(myArray[i]);
