C#中的集合、哈希表、泛型集合、字典
集合ArrayList
集合:集合可以看做是數組,可以將其看成“長度可變,具有很多方法的數組”。使用ArrayList,首先需要導入命名空間using.system.collections。通過添加和刪除元素,就可以動態改變數組的長度。
優點:動態的增加和刪除元素;實現了ICollection和IList接口;靈活的設置數組的大小。
ArrayList的構造器:
?
ArrayList的屬性:
?
?
?
集合常用的方法:
添加數據:給集合添加數據用add()這個方法。添加內容可以無限添加。
ArrayList arrayList=new ArrayList(); arrayList.Add(10); arrayList.Add(20); arratList.Add("小蘇"); arrayList.Add('女'); arrayList.Add(true); arrayList.Add(3.15m); arrayList.Add(56.8);?往集合中添加數據有三種方式:
A、通過構造函數可以添加一個數組;
B、通過Add()方法添加數組,但是算成一個元素;
C、通過AddRange()方法可以添加數組。
使用Add()可以添加數據,并且與數組一樣可以使用下標(索引)訪問數據,使用下標訪問的數據是object類型的,必要時需要進行轉換,必須滿足里式轉換原則。
Addrange()將數組或集合當中的數據批量的一個一個的加進來。Add()同樣可以將數組或集合作為數據加入,但此時加入是將數組或集合作為一個項加過去。只有找到該項,才能通過下標訪問其中的數據。
插入數據:給集合插入數據使用Insert()方法,通過索引插入數據。
ArrayList arrayList=new ArrayList();arrayList.Add(1);arrayList.Add(3);arrayList.Add(5);arrayList.Add(7);arrayList.Add(9);for (int i=1;i<+10;i+=2){arrayList.Insert(i,i+1);//往某個下標的位置插入一個值}其他常用方法:
ArrayList arraylist=new ArrayList();//實例化arraylist.Clear();//清空內容arraylist.Contains(1);//判斷集合中是否包含這個元素Console.WriteLine(arraylist.Contains(1));int num = arraylist.Count;//集合中元素的個數int number = arraylist.IndexOf(2);//找集合中某一個元素的索引 Console.WriteLine(number);arraylist.InsertRange(,)//往某一個索引位置插入一個數組arraylist.Remove(1);//從集合中移除某個元素arraylist.RemoveAt(1);//移除索引對應的值arraylist.RemoveRange(,);//從指定索引處開始移除 移除多少了 如果超出索引則報異常arraylist.Reverse();// 反轉arraylist.Sort();//排序int number= arraylist.Count//利用ArrayList的Count屬性查看該集合中元素的數量三種遍歷方法:
//第一種遍歷:ArrayList對象的方法 foreach(object o in al) {Console.Write(o.ToString()+" ") }//第二種遍歷:ArrayList對象的方法 IEnumerator ie=al.GetEnumerator(); While(ie.MoveNext()) {Console.Write(ie.Curret.ToString()+""); }//第三種遍歷:ArrayList對象的方法。利用ArrayList對象的Count屬性,它返回此對象中元素的個數,然后再通過索引遍歷 for(int i=0;i<Count;i++) {Console.Write(al[i].ToString()+""); }哈希表Hashtable
哈希表:也叫散列表,它是非泛型集合,是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表(哈希表)。
在.NET Framework中,Hashtable是System.Collections命名空間提供的一個容器,用于處理和表現類似keyvalue的鍵值對,其中key通常可用來快速查找,同時key是區分大小寫;value用于存儲對應于key的值。Hashtable中keyvalue鍵值對均為object類型,所以Hashtable可以支持任何類型的keyvalue鍵值對.Hashtable實現了IDictionary、ICollection以及IEnumerable接口。注意Hashtable,t是小寫的。由于是非泛型集合,因此存儲進去的都是object類型,不管是鍵還是值。
什么情況下使用哈希表?
某些數據會被高頻率查詢;數據量大;查詢字段包含字符串類型;數據類型不唯一。
說明:
(1)、Hashtable僅有非泛型版本。
?? (2)、Hashtable類中的鍵不允許重復,但值可以。
?? (3)、Hashtable類所存儲的鍵值對中,值可以為null,但鍵不允許為null。
?? (4)、Hashtable不允許排序操作。
?
?
哈希表的使用:Hashtable提供的功能是在于ArraryList差不多,只不過存儲的是鍵值對而已。
Hashtable ht=new Hashtable();//添加一個key value鍵值對 ht.Add("小蘇",'001'); ht.Add(002,"小馬"); ht.Add(new Person("小楊",'男',12),003);//移除某個key value鍵值對 ht.Remove(key);//移除所有元素 ht.Clear();//判斷是否包含特定鍵key ht.Contains(key);遍歷哈希表:
//遍歷哈希表 foreach(DictionaryEntry de in ht) //ht為一個Hashtable實例 {Console.WriteLine(de.Key); //de.Key對應于keyvalue鍵值對keyConsole.WriteLine(de.Value); //de.Key對應于keyvalue鍵值對value }//遍歷鍵 foreach (int key in hashtable.Keys) {Console.WriteLine(key); }//遍歷值foreach (string value in hashtable.Values) {Console.WriteLine(value); }?
?
泛型集合List< >
泛型集合:字符串可以說是一個字符的集合,和字符串一樣,數據對象也可以是集合的方式存在,所以泛型類對象也可以是集合的方式存在(泛型集合)。
?? 同傳統的集合相比,泛型集合是一種強類型的集合,它解決了類型安全問題,同時避免了集合中每次的裝箱與拆箱的操作,提升了性能。
泛型集合類型:
1. List,這是我們應用最多的泛型種類,它對應ArrayList集合。
//不知道存什么類型 也不知道存多少個 用Arraylist 需要導入命名空間
//知道存什么類型 但是不知道存多少個 用list<> 不需要導入命名空間
?? 2. Dictionary,這也是我們平時運用比較多的泛型種類,對應Hashtable集合。
?? 3. Collection對應于CollectionBase
?? 4. ReadOnlyCollection 對應于ReadOnlyCollectionBase,這是一個只讀的集合。
?? 5. Queue,Stack和SortedList,它們分別對應于與它們同名的非泛型類。
List<T>在C#應用程序中是一種快捷、易于使用的泛型集合類型,使用泛型編程為編寫面向對象程序增加了極大的效率和靈活性,不會強行對值類型進行裝箱和拆箱,或對引用類型進行向下強制類型轉換。
在決定使用IList<T> 還是使用ArrayList類(兩者具有類似的功能)時,IList<T> 類在大多數情況下執行得更好并且是類型安全的。
如果對IList<T> 類的類型 T 使用引用類型,則兩個類的行為是完全相同的。但是,如果對類型 T 使用值類型,則需要考慮實現和裝箱問題。
添加到 ArrayList 中的任何引用或值類型都將隱式地向上強制轉換為 Object。如果項是值類型,則必須在將其添加到列表中時進行裝箱操作,在檢索時進行取消裝箱操作。強制轉換以及裝箱和取消裝箱操作都會降低性能;在必須對大型集合進行循環訪問的情況下,裝箱和取消裝箱的影響非常明顯。
List方法:
//隨機的往集合里添加10個數,求和 最值 平均值List<int>list=new List<int>(); Random r=new Random(); int num=0; while(list.Count!10) {num=r.Next(1,100);if(!list.Countains(num)){list.Add(num);Console.Write(num+" ");} }Console.WriteLine("最大值:{0}",list.Max()); Console.WriteLine("最小值:{0}",list.Min()); Console.WriteLine("和為:{0}",list.Sum()); Console.WriteLine("平均值:{0}",list.Average()); Console.ReadKey();List<T>的基本用法: 創建List<T>類具體實例: 創建一個普通的泛型集合類: List<T> mList = new List<T>();T為列表中元素類型,現在以string類型作為例子 List<string> mList = new List<string>();以一個集合作為參數創建新的泛型集合List<T> List<T> testList =new List<T> (IEnumerable<T> collection); 下面是一個具體的例子: string[] temArr = { "Ha", "Hunter", "Tom", "Lily", "Jay", "Jim", "Kuku", "Locu" }; List<string> testList = new List<string>(temArr);增加元素到List<T>: 添加一個元素: List. Add(T item) 示例: testList.Add("John");添加一組元素集合: List. AddRange(IEnumerable<T> collection) 示例: string[] temArr = { "Ha","Hunter", "Tom", "Lily", "Jay", "Jim", "Kuku", "Locu" }; testList.AddRange(temArr);在指定位置添加一個元素: Insert(int index, T item); 其中,index指定了要添加元素的位置,示例: testList.Insert(1, "Hei");泛型集合List<T>元素遍歷: 使用foreach可以輕松遍歷List<T>中的所有元素,示例: foreach (string s in mList) {Console.WriteLine(s); }刪除List<T>中的元素: 刪除單個元素: List. Remove(T item) item指定了要刪除元素的對象,示例: mList.Remove("Hunter");刪除指定位置的元素: List.RemoveAt(int index); 其中,index指定了要刪除元素的索引值,示例: mList.RemoveAt(0);刪除多個元素: List.RemoveRange(int index, int count); index指定了刪除元素的起始位置,count指定了從起始位置開始需要刪除元素的個數,示例: mList.RemoveRange(3, 2);判斷某個元素是否在該List<T>中: List.Contains(T item) 該方法用于確定某元素是否在 List<(Of <(T>)>) 中,如果在 List<(Of <(T>)>) 中找到 item,則為 true,否則為 false,示例: if (mList.Contains("Hunter")){Console.WriteLine("There is Hunter in the list"); }else{mList.Add("Hunter");Console.WriteLine("Add Hunter successfully."); }給List<T>里面元素排序: List.Sort () 該方法將集合類List<T>中的元素按照 默認的方式元素第一個字母升序排序。給List<T>里面元素順序反轉: List.Reverse () 該方法可以與List. Sort ()配合使用,以達到想要的效果。清空List<T>中的所有元素: List.Clear () 該方法將清空List<T>中的所有元素獲得List<T>中元素數目: List. Count () 該方法返回List<T>中元素個數的int類型值,示例: int count = mList.Count(); Console.WriteLine("The num of elements in the list: " +count);字典Dictionary<? >
字典:在C#中,Dictionary提供快速的基于兼職的元素查找。結構是這樣的:Dictionary<[key], [value]> ,當有很多元素的時候可以使用它。它包含在System.Collections.Generic名空間中。在使用前,必須聲明它的鍵類型和值類型。
?
要使用Dictionary集合,需要導入C#泛型命名空間:System.Collections.Generic(程序集:mscorlib)
?
說明:
1、從一組鍵(Key)到一組值(Value)的映射,每一個添加項都是由一個值及其相關連的鍵組成
2、任何鍵都必須是唯一的,而值不需要唯一的
3、鍵不能為空引用null(VB中的Nothing),若值為引用類型,則可以為空值
4、Key和Value可以是任何類型(string,int,custom class 等)
Dictionary使用方法:
?
//定義Dictionary<string, string> openWith = new Dictionary<string, string>();Dictionary<int,string> myDictionary=new Dictionary<int,string>();//添加元素openWith.Add("txt", "notepad.exe");openWith.Add("bmp", "paint.exe");openWith.Add("dib", "paint.exe");openWith.Add("rtf", "wordpad.exe");myDictionary.Add(1,"C#");myDictionary.Add(2,"C++");myDictionary.Add(3,"ASP.NET");myDictionary.Add(4,"MVC");//取值Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]);//通過Key查找元素if(myDictionary.ContainsKey(1)){Console.WriteLine("Key:{0},Value:{1}","1", myDictionary[1]);}//通過鍵更改值openWith["rtf"] = "winword.exe";Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]);//遍歷keyforeach (string key in openWith.Keys){Console.WriteLine("Key = {0}", key);}//遍歷value,方法1foreach (string value in openWith.Values){Console.WriteLine("value = {0}", value);}//遍歷value, 方法2Dictionary<string, string>.ValueCollection valueColl = openWith.Values;foreach (string s in valueColl){Console.WriteLine("Second Method, Value = {0}", s);}//遍歷字典foreach (KeyValuePair<string, string> kvp in openWith){Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);}//添加存在的元素try{openWith.Add("txt", "winword.exe");}catch (ArgumentException){Console.WriteLine("An element with Key = \"txt\" already exists.");}//刪除元素openWith.Remove("doc");if (!openWith.ContainsKey("doc")){Console.WriteLine("Key \"doc\" is not found.");}//判斷鍵存在if (openWith.ContainsKey("bmp")) // True {Console.WriteLine("An element with Key = \"bmp\" exists.");}常用屬性:
| Comparer | 獲取用于確定字典中的鍵是否相等的? IEqualityComparer<T>。 |
| Count | 獲取包含在 Dictionary<TKey, TValue> 中的鍵/值對的數目。 |
| Item | 獲取或設置與指定的鍵相關聯的值。 |
| ? Keys???????? | 獲取包含 Dictionary<TKey, TValue> 中的鍵的集合。 |
| Values | 獲取包含 Dictionary<TKey, TValue> 中的值的集合。 |
常用方法:
| 方法名 | 說明 |
| Add | 將指定的鍵和值添加到字典中 |
| Clear? | 從 Dictionary<TKey, TValue> 中移除所有的鍵和值 |
| ContainsKey? | 確定 Dictionary<TKey, TValue> 是否包含指定的鍵 |
| ContainsValue | 確定 Dictionary<TKey, TValue> 是否包含特定值 |
| Equals(Object) | ?確定指定的 Object 是否等于當前的 Object。 (繼承自 Object。) |
| Finalize | 允許對象在“垃圾回收”回收之前嘗試釋放資源并執行其他清理操作 |
| GetEnumerator | 返回循環訪問 Dictionary<TKey, TValue> 的枚舉器 |
| GetHashCode | 用作特定類型的哈希函數。 (繼承自 Object。) |
| GetObjectData? | 實現 System.Runtime.Serialization.ISerializable 接口,并返回序列化 Dictionary<TKey, TValue> 實例所需的數據 |
| GetType?? | 獲取當前實例的 Type。 (繼承自 Object。) |
| MemberwiseClone | 創建當前 Object 的淺表副本。 (繼承自 Object。) |
| OnDeserialization??? | 實現 System.Runtime.Serialization.ISerializable 接口,并在完成反序列化之后引發反序列化事件 |
| Remove? | 從 Dictionary<TKey, TValue> 中移除所指定的鍵的值 |
| ToString | 返回表示當前對象的字符串。 (繼承自 Object。) |
| TryGetValue? | 獲取與指定的鍵相關聯的值 |
小結
ArrayList&List:都可以添加數據,數據的個數不受限制,很多方法相似。
ArrayList&Hashtable:都需要導入命名空間,存的數據不限制什么類型。
Hashtable&Dictionary:都是以鍵值對的形式存值,方法也都很相似。
List&Dictionary:都不用導入命名空間,都確定了存數據的類型。
以上都可以用foreach遍歷,存數據的個數都不受限制。
?
上面介紹到的ArrayList、Hashtable、List<>、Dictionary<>都是集合。那么,什么是 集合呢?
C# 集合(Collection)
集合(Collection)類是專門用于數據存儲和檢索的類。這些類提供了對棧(stack)、隊列(queue)、列表(list)和哈希表(hash table)的支持。大多數集合類實現了相同的接口。
集合(Collection)類服務于不同的目的,如為元素動態分配內存,基于索引訪問列表項等等。這些類創建 Object 類的對象的集合。在 C# 中,Object 類是所有數據類型的基類。
?說明:
1、BCL中集合類型分為泛型集合與非泛型集合。
2、非泛型集合的類和接口位于System.Collections命名空間。
3、泛型集合的類和接口位于System.Collections.Generic命名空間。
?
ICollection接口是System.Collections命名空間中非泛型集合類的基接口,它繼承自IEnumerable接口,從IEnumerable接口繼承意味著實現該接口的實現類需要實現一個枚舉器方法:GetEnumerator,該方法返回IEnumerator類型的數據。IDictionary和IList接口繼承自ICollection作為更為專用的接口,其中IDictionary接口是鍵/值對接口,它的實現如HashTable類;而IList是值的集合,其成員可通過索引訪問,如ArrayList類,次類集合與數組相比,可以認為是可變的集合,優點有,長度自動增長等。IEnumerable<T>和IEnumerable是所有集合或集合接口的基接口,所有集合接口或集合都繼承、實現了它。其中IEnumerable是最底層的接口。在非泛型集合里存放的都是System.Object.
| 非泛型集合接口 | 泛型集合接口 | 說明 |
| ICollection | ICollection<T> | 定義所有集合的大小(Count),枚舉器(foreach)和同步 |
| IList | IList<T> | 表示可按照索引單獨訪問的一組對象(像數組一樣) |
| IDictionary | IDictionary<T> | 表示鍵/值對的集合 |
| IComparer | IComparer<T> | 定義類型為比較兩個對象而實現的方法 |
| IEqualityComparer | IEqualityComparer<T> | 定義方法以支持對象的相等比較 |
| IEnumerable | IEnumerable<T> | 公開枚舉器。實現了該接口意味著允許foreach語句循環訪問 |
| IEnumerator | IEnumerator<T> | 支持在泛型集合上進行簡單迭代 |
| ? | ? | ? |
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的C#中的集合、哈希表、泛型集合、字典的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 独自学习/组团学习,什么情境下采用效果更
- 下一篇: 三层架构---理论篇