日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C#中的集合、哈希表、泛型集合、字典

發(fā)布時(shí)間:2023/12/20 C# 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#中的集合、哈希表、泛型集合、字典 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

集合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.");}

常用屬性:

? ?? 名稱(chēng)說(shuō)明
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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。