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