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

歡迎訪問 生活随笔!

生活随笔

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

C#

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

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

集合ArrayList

集合:集合可以看做是數(shù)組,可以將其看成“長度可變,具有很多方法的數(shù)組”。使用ArrayList,首先需要導(dǎo)入命名空間using.system.collections。通過添加和刪除元素,就可以動態(tài)改變數(shù)組的長度。

優(yōu)點:動態(tài)的增加和刪除元素;實現(xiàn)了ICollection和IList接口;靈活的設(shè)置數(shù)組的大小。

ArrayList的構(gòu)造器:

?

ArrayList的屬性:

?

?

?

集合常用的方法:

添加數(shù)據(jù):給集合添加數(shù)據(jù)用add()這個方法。添加內(nèi)容可以無限添加。

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、通過構(gòu)造函數(shù)可以添加一個數(shù)組;

B、通過Add()方法添加數(shù)組,但是算成一個元素;

C、通過AddRange()方法可以添加數(shù)組。

使用Add()可以添加數(shù)據(jù),并且與數(shù)組一樣可以使用下標(索引)訪問數(shù)據(jù),使用下標訪問的數(shù)據(jù)是object類型的,必要時需要進行轉(zhuǎn)換,必須滿足里式轉(zhuǎn)換原則。

Addrange()將數(shù)組或集合當(dāng)中的數(shù)據(jù)批量的一個一個的加進來。Add()同樣可以將數(shù)組或集合作為數(shù)據(jù)加入,但此時加入是將數(shù)組或集合作為一個項加過去。只有找到該項,才能通過下標訪問其中的數(shù)據(jù)。

插入數(shù)據(jù):給集合插入數(shù)據(jù)使用Insert()方法,通過索引插入數(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);//往某個下標的位置插入一個值}

其他常用方法:

ArrayList arraylist=new ArrayList();//實例化arraylist.Clear();//清空內(nèi)容arraylist.Contains(1);//判斷集合中是否包含這個元素Console.WriteLine(arraylist.Contains(1));int num = arraylist.Count;//集合中元素的個數(shù)int number = arraylist.IndexOf(2);//找集合中某一個元素的索引 Console.WriteLine(number);arraylist.InsertRange(,)//往某一個索引位置插入一個數(shù)組arraylist.Remove(1);//從集合中移除某個元素arraylist.RemoveAt(1);//移除索引對應(yīng)的值arraylist.RemoveRange(,);//從指定索引處開始移除 移除多少了 如果超出索引則報異常arraylist.Reverse();// 反轉(zhuǎn)arraylist.Sort();//排序int number= arraylist.Count//利用ArrayList的Count屬性查看該集合中元素的數(shù)量

三種遍歷方法:

//第一種遍歷: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屬性,它返回此對象中元素的個數(shù),然后再通過索引遍歷 for(int i=0;i<Count;i++) {Console.Write(al[i].ToString()+""); }

哈希表Hashtable

哈希表:也叫散列表,它是非泛型集合,是根據(jù)關(guān)鍵碼值(Key value)而直接進行訪問的數(shù)據(jù)結(jié)構(gòu)。也就是說,它通過把關(guān)鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數(shù)叫做散列函數(shù),存放記錄的數(shù)組叫做散列表(哈希表)。

在.NET Framework中,Hashtable是System.Collections命名空間提供的一個容器,用于處理和表現(xiàn)類似keyvalue的鍵值對,其中key通常可用來快速查找,同時key是區(qū)分大小寫;value用于存儲對應(yīng)于key的值。Hashtable中keyvalue鍵值對均為object類型,所以Hashtable可以支持任何類型的keyvalue鍵值對.Hashtable實現(xiàn)了IDictionary、ICollection以及IEnumerable接口。注意Hashtable,t是小寫的。由于是非泛型集合,因此存儲進去的都是object類型,不管是鍵還是值。

什么情況下使用哈希表?

某些數(shù)據(jù)會被高頻率查詢;數(shù)據(jù)量大;查詢字段包含字符串類型;數(shù)據(jù)類型不唯一。

說明:

(1)、Hashtable僅有非泛型版本。

   ?? (2)、Hashtable類中的鍵不允許重復(fù),但值可以。

   ?? (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對應(yīng)于keyvalue鍵值對keyConsole.WriteLine(de.Value); //de.Key對應(yīng)于keyvalue鍵值對value }//遍歷鍵 foreach (int key in hashtable.Keys) {Console.WriteLine(key); }//遍歷值foreach (string value in hashtable.Values) {Console.WriteLine(value); }

?


?

泛型集合List< >

泛型集合:字符串可以說是一個字符的集合,和字符串一樣,數(shù)據(jù)對象也可以是集合的方式存在,所以泛型類對象也可以是集合的方式存在(泛型集合)。

   ?? 同傳統(tǒng)的集合相比,泛型集合是一種強類型的集合,它解決了類型安全問題,同時避免了集合中每次的裝箱與拆箱的操作,提升了性能。

泛型集合類型:

1. List,這是我們應(yīng)用最多的泛型種類,它對應(yīng)ArrayList集合。

//不知道存什么類型 也不知道存多少個 用Arraylist 需要導(dǎo)入命名空間

//知道存什么類型 但是不知道存多少個 用list<> 不需要導(dǎo)入命名空間

   ?? 2. Dictionary,這也是我們平時運用比較多的泛型種類,對應(yīng)Hashtable集合。

   ?? 3. Collection對應(yīng)于CollectionBase

   ?? 4. ReadOnlyCollection 對應(yīng)于ReadOnlyCollectionBase,這是一個只讀的集合。

   ?? 5. Queue,Stack和SortedList,它們分別對應(yīng)于與它們同名的非泛型類。

List<T>在C#應(yīng)用程序中是一種快捷、易于使用的泛型集合類型,使用泛型編程為編寫面向?qū)ο蟪绦蛟黾恿藰O大的效率和靈活性,不會強行對值類型進行裝箱和拆箱,或?qū)σ妙愋瓦M行向下強制類型轉(zhuǎn)換。

在決定使用IList<T> 還是使用ArrayList類(兩者具有類似的功能)時,IList<T> 類在大多數(shù)情況下執(zhí)行得更好并且是類型安全的。

如果對IList<T> 類的類型 T 使用引用類型,則兩個類的行為是完全相同的。但是,如果對類型 T 使用值類型,則需要考慮實現(xiàn)和裝箱問題。

添加到 ArrayList 中的任何引用或值類型都將隱式地向上強制轉(zhuǎn)換為 Object。如果項是值類型,則必須在將其添加到列表中時進行裝箱操作,在檢索時進行取消裝箱操作。強制轉(zhuǎn)換以及裝箱和取消裝箱操作都會降低性能;在必須對大型集合進行循環(huán)訪問的情況下,裝箱和取消裝箱的影響非常明顯。

List方法:

//隨機的往集合里添加10個數(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>類具體實例: 創(chuàng)建一個普通的泛型集合類: List<T> mList = new List<T>();T為列表中元素類型,現(xiàn)在以string類型作為例子 List<string> mList = new List<string>();以一個集合作為參數(shù)創(chuàng)建新的泛型集合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指定了從起始位置開始需要刪除元素的個數(shù),示例: 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>里面元素順序反轉(zhuǎn): List.Reverse () 該方法可以與List. Sort ()配合使用,以達到想要的效果。清空List<T>中的所有元素: List.Clear () 該方法將清空List<T>中的所有元素獲得List<T>中元素數(shù)目: List. Count () 該方法返回List<T>中元素個數(shù)的int類型值,示例: 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)有很多元素的時候可以使用它。它包含在System.Collections.Generic名空間中。在使用前,必須聲明它的鍵類型和值類型。

?

要使用Dictionary集合,需要導(dǎo)入C#泛型命名空間:System.Collections.Generic(程序集:mscorlib)

?

說明:

1、從一組鍵(Key)到一組值(Value)的映射,每一個添加項都是由一個值及其相關(guān)連的鍵組成

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> 中的鍵/值對的數(shù)目。
Item獲取或設(shè)置與指定的鍵相關(guān)聯(lián)的值。
? Keys????????獲取包含 Dictionary<TKey, TValue> 中的鍵的集合。
Values獲取包含 Dictionary<TKey, TValue> 中的值的集合。

常用方法:

方法名說明
Add將指定的鍵和值添加到字典中
Clear?從 Dictionary<TKey, TValue> 中移除所有的鍵和值
ContainsKey?確定 Dictionary<TKey, TValue> 是否包含指定的鍵
ContainsValue確定 Dictionary<TKey, TValue> 是否包含特定值
Equals(Object)?確定指定的 Object 是否等于當(dāng)前的 Object。 (繼承自 Object。)
Finalize允許對象在“垃圾回收”回收之前嘗試釋放資源并執(zhí)行其他清理操作
GetEnumerator返回循環(huán)訪問 Dictionary<TKey, TValue> 的枚舉器
GetHashCode用作特定類型的哈希函數(shù)。 (繼承自 Object。)
GetObjectData?實現(xiàn) System.Runtime.Serialization.ISerializable 接口,并返回序列化 Dictionary<TKey, TValue> 實例所需的數(shù)據(jù)
GetType??獲取當(dāng)前實例的 Type。 (繼承自 Object。)
MemberwiseClone創(chuàng)建當(dāng)前 Object 的淺表副本。 (繼承自 Object。)
OnDeserialization???實現(xiàn) System.Runtime.Serialization.ISerializable 接口,并在完成反序列化之后引發(fā)反序列化事件
Remove?從 Dictionary<TKey, TValue> 中移除所指定的鍵的值
ToString返回表示當(dāng)前對象的字符串。 (繼承自 Object。)
TryGetValue?獲取與指定的鍵相關(guān)聯(lián)的值

小結(jié)

ArrayList&List:都可以添加數(shù)據(jù),數(shù)據(jù)的個數(shù)不受限制,很多方法相似。

ArrayList&Hashtable:都需要導(dǎo)入命名空間,存的數(shù)據(jù)不限制什么類型。

Hashtable&Dictionary:都是以鍵值對的形式存值,方法也都很相似。

List&Dictionary:都不用導(dǎo)入命名空間,都確定了存數(shù)據(jù)的類型。

以上都可以用foreach遍歷,存數(shù)據(jù)的個數(shù)都不受限制。

?

上面介紹到的ArrayList、Hashtable、List<>、Dictionary<>都是集合。那么,什么是 集合呢?

C# 集合(Collection)

集合(Collection)類是專門用于數(shù)據(jù)存儲和檢索的類。這些類提供了對棧(stack)、隊列(queue)、列表(list)和哈希表(hash table)的支持。大多數(shù)集合類實現(xiàn)了相同的接口。

集合(Collection)類服務(wù)于不同的目的,如為元素動態(tài)分配內(nèi)存,基于索引訪問列表項等等。這些類創(chuàng)建 Object 類的對象的集合。在 C# 中,Object 類是所有數(shù)據(jù)類型的基類。

?說明:

1、BCL中集合類型分為泛型集合與非泛型集合。

2、非泛型集合的類和接口位于System.Collections命名空間。

3、泛型集合的類和接口位于System.Collections.Generic命名空間。

?

  ICollection接口是System.Collections命名空間中非泛型集合類的基接口,它繼承自IEnumerable接口,從IEnumerable接口繼承意味著實現(xiàn)該接口的實現(xiàn)類需要實現(xiàn)一個枚舉器方法:GetEnumerator,該方法返回IEnumerator類型的數(shù)據(jù)。IDictionary和IList接口繼承自ICollection作為更為專用的接口,其中IDictionary接口是鍵/值對接口,它的實現(xiàn)如HashTable類;而IList是值的集合,其成員可通過索引訪問,如ArrayList類,次類集合與數(shù)組相比,可以認為是可變的集合,優(yōu)點有,長度自動增長等。IEnumerable<T>和IEnumerable是所有集合或集合接口的基接口,所有集合接口或集合都繼承、實現(xiàn)了它。其中IEnumerable是最底層的接口。在非泛型集合里存放的都是System.Object.

非泛型集合接口泛型集合接口說明
ICollection ICollection<T>定義所有集合的大小(Count),枚舉器(foreach)和同步
IList IList<T>表示可按照索引單獨訪問的一組對象(像數(shù)組一樣)
IDictionary IDictionary<T>表示鍵/值對的集合
IComparer IComparer<T>定義類型為比較兩個對象而實現(xiàn)的方法
IEqualityComparer IEqualityComparer<T>定義方法以支持對象的相等比較
IEnumerable IEnumerable<T>公開枚舉器。實現(xiàn)了該接口意味著允許foreach語句循環(huán)訪問
IEnumerator IEnumerator<T>支持在泛型集合上進行簡單迭代
???

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的C#中的集合、哈希表、泛型集合、字典的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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