C#各類集合匯總
集合(Collection)類是專門用于數(shù)據(jù)存儲(chǔ)和檢索的類。這些類提供了對(duì)棧(stack)、隊(duì)列(queue)、列表(list)和哈希表(hash table)的支持。大多數(shù)集合類實(shí)現(xiàn)了相同的接口。
平常在工作中List<T>集合是用的最多的,其次是Array(數(shù)組).今天整理一下各類形式的集合,不用就容易忘,必須要記錄一下.
Array
Array:在內(nèi)存上是連續(xù)分配的(可定義長(zhǎng)度,也可不定義長(zhǎng)度),Array中的元素類型要一樣。
Array通過(guò)坐標(biāo)(索引)訪問(wèn),讀取、修改快---增刪慢
如果Array定義了長(zhǎng)度,數(shù)據(jù)項(xiàng)就不能超過(guò)Array中的長(zhǎng)度范圍.
ArrayList
ArrayList:不定長(zhǎng)度的,連續(xù)分配的
//元素沒(méi)有類型限制 任何元素都當(dāng)成object處理,如果是值類型會(huì)有裝箱操作 ArrayList arrayList = new ArrayList(); arrayList.Add("object");//可以放string arrayList.Add(Enumerable.Range(1,100).ToArray());//可以放Array Func<string, int> func = m => 1; arrayList.Add(func);//可以放Delegate
//移除數(shù)據(jù) arrayList.RemoveAt(0);//通過(guò)索引坐標(biāo)移除 arrayList.Remove("object");//匹配第一個(gè)元素值,滿足就移除
List
List:也是Array,內(nèi)存上都是連續(xù)擺放的;不定長(zhǎng);泛型,保證類型安全,避免裝箱拆箱(都是統(tǒng)一的類型)
var list = new List<int>() { 1, 2, 3 }; list.Add(1); list.AddRange(new List<int> { 4, 5, 6 });//批量添加 list.Any();//判斷是否有數(shù)據(jù) list.Clear();//清除所有數(shù)據(jù) list.ForEach((m) => { });//foreach循環(huán),參數(shù)=>viod委托 list.Skip(1).Take(2);//取索引為0之后的兩條數(shù)據(jù) //... ...
以上三種都屬于Array類型,只要是Array類型都是讀取快(可通過(guò)索引訪問(wèn)),增刪慢.
LinkedList
LinkedList:雙向鏈表 元素不連續(xù)分配,每個(gè)元素都有記錄前后節(jié)點(diǎn)。
//在頭部和尾部都標(biāo)識(shí)了上一個(gè)元素和下一個(gè)元素所處位置 LinkedList<int> list = new LinkedList<int>(); list.AddLast(1); list.AddFirst(1); bool isBool = list.Contains(1);//判斷鏈表中是否有1這個(gè)元素 LinkedListNode<int> list1 = list.Find(123);//找到元素123的這個(gè)節(jié)點(diǎn) list.AddBefore(list1, 0);//前面增加 list.AddAfter(list1, 0);//后面增加 list.Remove(1); list.Remove(list1);//根據(jù)節(jié)點(diǎn)刪除 list.RemoveFirst(); list.RemoveLast(); list.Clear();
鏈表不能通過(guò)元素索引訪問(wèn)。找元素只能遍歷。增刪比較快,增加或刪除,只需把這個(gè)元素的前后兩個(gè)元素指向的元素節(jié)點(diǎn)改一下。
Queue
Queue 隊(duì)列,就是鏈表 先進(jìn)先出
//用處;放任務(wù)延遲執(zhí)行 A不斷寫(xiě)入任務(wù),B不斷獲取任務(wù)執(zhí)行 每次拿最近的一個(gè)任務(wù) Queue<string> queue = new Queue<string>(); queue.Enqueue("object");//添加數(shù)據(jù) queue.Enqueue("object1"); foreach (var item in queue) { Console.WriteLine(item); } queue.Dequeue();//獲取最先進(jìn)入隊(duì)列的元素,獲得并移除 queue.Peek();//獲取但不移除
Stack
Stack:棧 也是鏈表, 先進(jìn)后出 先產(chǎn)生的數(shù)據(jù)最后使用
Stack<string> stack = new Stack<string>(); stack.Push("object");//添加數(shù)據(jù) stack.Push("object1"); stack.Pop();//獲取最后進(jìn)入隊(duì)列的元素 獲得并移除 stack.Peek();//獲取不移除
C#中(線程)棧的內(nèi)存釋放也是一樣,先實(shí)例化的對(duì)象最后釋放(在棧中聲明的變量,最先聲明的最后GC)
數(shù)組和鏈表(LinkedList、Queue、Stack)是他們內(nèi)存分配的本質(zhì)而區(qū)分的,元素連續(xù)分配和不連續(xù)分配.
Set類型集合
HashSet
HashSet:hash分布,元素間沒(méi)關(guān)系(不用記錄前后節(jié)點(diǎn)),動(dòng)態(tài)增加.
HashSet<string> hashSet = new HashSet<string>(); hashSet.Add("object1");//添加元素 hashSet.Add("object2"); hashSet.Add("object3"); hashSet.Add("object1");//會(huì)自動(dòng)去重 int count = hashSet.Count;//獲得數(shù)量 hashSet.Contains("object"); HashSet<string> hashSet1 = new HashSet<string>(); hashSet1.Add("object1"); hashSet1.Add("object2"); hashSet1.Add("object4"); hashSet1.SymmetricExceptWith(hashSet);//補(bǔ)集:不包含hashSet1和hashSet共有的所有元素 hashSet1.UnionWith(hashSet);//并集:hashSet1和hashSet所有的元素 hashSet1.ExceptWith(hashSet);//差集:hashSet1有的元素而hashSet沒(méi)有的元素 hashSet1.IntersectWith(hashSet);//交集:共同的元素 hashSet1.ToList(); hashSet1.Clear();
SortedSet
SortedSet:排序集合 去重+排序.SortedSet也可以做交差并補(bǔ).
//IComparer<T>? comparer 自定義對(duì)象要排序,就用這個(gè)指定 SortedSet<string> sortedSet = new SortedSet<string>(); sortedSet.Add("object1"); sortedSet.Add("object2"); sortedSet.Add("object1");//會(huì)自動(dòng)去重 int count = sortedSet.Count; sortedSet.Contains("object1");
HashTable(key-value)類型集合
Hashtable:
拿著key計(jì)算一個(gè)內(nèi)存地址,然后放入key-value。長(zhǎng)度不定,可以動(dòng)態(tài)增加。放入的都是object類型,所以避免不了裝箱拆箱。
//如果不同的key得到相同的內(nèi)存地址,第二個(gè)在前面的地址上+1,由此會(huì)形成數(shù)組 //查找的時(shí)候,如果地址對(duì)應(yīng)的key不對(duì),那就+1查找//查找個(gè)數(shù)據(jù) 一次定位,增刪查改都很快 //數(shù)據(jù)太多 重復(fù)定位,效率就下去了 Hashtable hashtable = new Hashtable(); hashtable.Add("key", "value"); hashtable[111] = 222;//KEY,VALUE foreach (DictionaryEntry item in hashtable) { Console.WriteLine(item.Key.ToString()); Console.WriteLine(item.Value.ToString()); } //線程安全 Hashtable.Synchronized(hashtable);//只有一個(gè)線程寫(xiě),多個(gè)線程讀
Dictionary:
相當(dāng)于泛型版本的HashTable.因?yàn)閿?shù)據(jù)基于泛型,減少了裝箱拆箱的消耗.
Dictionary<int, string> pairs = new Dictionary<int, string>(); pairs.Add(1, "object1"); pairs[2] = "object2"; foreach (var item in pairs) { Console.WriteLine(item.Key.ToString(), item.Value); } pairs.ContainsKey(1);//是否存在這個(gè)key //... ...
SortedDictionary:
排序字典,依據(jù)key進(jìn)行排序.因?yàn)橐判?所以增刪改慢,多了一個(gè)排序
SortedDictionary<int, string> pairs = new SortedDictionary<int, string>(); //根據(jù)key依次排序 pairs.Add(1, "object1"); pairs.Add(2, "object2"); pairs.Add(3, "object3"); pairs.Add(4, "object4");
SortedList:
也是key,value形式,自動(dòng)排序.不能重復(fù)添加,key重復(fù)會(huì)報(bào)錯(cuò)
IComparer comparer 自定義對(duì)象要排序,就用這個(gè)指定
SortedList sortedList = new SortedList(); sortedList.Add("2", "1"); var keyList = sortedList.GetKeyList(); var valueList = sortedList.GetValueList(); sortedList.TrimToSize();//用于最小化集合的內(nèi)存開(kāi)銷 sortedList.Remove("1");//根據(jù)key值移除 sortedList.RemoveAt(0);//根據(jù)索引移除 sortedList.Clear();//移除所有元素
字典集合線程不安全(非線程安全),這塊內(nèi)存多個(gè)線程都可以改 ConcurrentQueue 線程安全版本的Queue ConcurrentStack 線程安全版本的Stack ConcurrentBag (List集合是非線程安全的)ConcurrentBag線程安全版本的對(duì)象集合 ConcurrentDictionary 線程安全版本的Dictionary BlockingCollection 線程安全集合
ArrayList和List都實(shí)現(xiàn)了IList接口,可以通過(guò)索引訪問(wèn)元素,像鏈表這種就不可以通過(guò)索引訪問(wèn)元素.
但是鏈表這種集合繼承了ICollection類型的接口,因此可獲得集合的長(zhǎng)度(長(zhǎng)度不定的集合都繼承了ICollection接口)
IEnumerable\ICollection\IList\IQueryable
接口是標(biāo)識(shí)功能的.不同的接口拆開(kāi)就是為了接口隔離.實(shí)現(xiàn)不同的接口表明這個(gè)集合的功能不同.任何數(shù)據(jù)集合都實(shí)現(xiàn)IEnumerable,IEnumerable為不同的數(shù)據(jù)結(jié)構(gòu)(各種集合)提供了統(tǒng)一的數(shù)據(jù)訪問(wèn)方式(foreach)=》迭代器模式
以上就是C#各類集合匯總的詳細(xì)內(nèi)容,更多關(guān)于c# 集合的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C# WinForm捕獲全局變量異常 SamWang解決方法
本文將介紹C# WinForm捕獲全局變量異常 SamWang解決方法,需要的朋友可以參考2012-11-11C#利用iTextSharp組件給PDF文檔添加圖片/文字水印
這篇文章主要給大家介紹了關(guān)于如何C#利用iTextSharp組件給PDF文檔添加圖片/文字水印的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Unity游戲開(kāi)發(fā)中的設(shè)計(jì)模式之策略模式
策略模式是Unity游戲開(kāi)發(fā)中常用的設(shè)計(jì)模式之一,用于封裝一系列算法或行為,并使這些算法或行為可以相互替換。通過(guò)策略模式,可以在運(yùn)行時(shí)動(dòng)態(tài)地選擇算法或行為,實(shí)現(xiàn)游戲中的多樣性和可擴(kuò)展性。常見(jiàn)的應(yīng)用包括AI行為、武器攻擊、移動(dòng)方式等2023-05-05

C#中Json字符串的各種應(yīng)用類實(shí)例講解