C#各類集合匯總
集合(Collection)類是專門用于數(shù)據(jù)存儲和檢索的類。這些類提供了對棧(stack)、隊(duì)列(queue)、列表(list)和哈希表(hash table)的支持。大多數(shù)集合類實(shí)現(xiàn)了相同的接口。
平常在工作中List<T>集合是用的最多的,其次是Array(數(shù)組).今天整理一下各類形式的集合,不用就容易忘,必須要記錄一下.
Array
Array:在內(nèi)存上是連續(xù)分配的(可定義長度,也可不定義長度),Array中的元素類型要一樣。
Array通過坐標(biāo)(索引)訪問,讀取、修改快---增刪慢

如果Array定義了長度,數(shù)據(jù)項(xiàng)就不能超過Array中的長度范圍.

ArrayList
ArrayList:不定長度的,連續(xù)分配的
//元素沒有類型限制 任何元素都當(dāng)成object處理,如果是值類型會有裝箱操作
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);//通過索引坐標(biāo)移除
arrayList.Remove("object");//匹配第一個(gè)元素值,滿足就移除
List
List:也是Array,內(nèi)存上都是連續(xù)擺放的;不定長;泛型,保證類型安全,避免裝箱拆箱(都是統(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類型都是讀取快(可通過索引訪問),增刪慢.
LinkedList
LinkedList:雙向鏈表 元素不連續(xù)分配,每個(gè)元素都有記錄前后節(jié)點(diǎn)。
//在頭部和尾部都標(biāo)識了上一個(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();

鏈表不能通過元素索引訪問。找元素只能遍歷。增刪比較快,增加或刪除,只需把這個(gè)元素的前后兩個(gè)元素指向的元素節(jié)點(diǎn)改一下。
Queue
Queue 隊(duì)列,就是鏈表 先進(jìn)先出
//用處;放任務(wù)延遲執(zhí)行 A不斷寫入任務(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í)例化的對象最后釋放(在棧中聲明的變量,最先聲明的最后GC)

數(shù)組和鏈表(LinkedList、Queue、Stack)是他們內(nèi)存分配的本質(zhì)而區(qū)分的,元素連續(xù)分配和不連續(xù)分配.
Set類型集合
HashSet
HashSet:hash分布,元素間沒關(guān)系(不用記錄前后節(jié)點(diǎn)),動態(tài)增加.
HashSet<string> hashSet = new HashSet<string>();
hashSet.Add("object1");//添加元素
hashSet.Add("object2");
hashSet.Add("object3");
hashSet.Add("object1");//會自動去重
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沒有的元素
hashSet1.IntersectWith(hashSet);//交集:共同的元素
hashSet1.ToList();
hashSet1.Clear();
SortedSet
SortedSet:排序集合 去重+排序.SortedSet也可以做交差并補(bǔ).
//IComparer<T>? comparer 自定義對象要排序,就用這個(gè)指定
SortedSet<string> sortedSet = new SortedSet<string>();
sortedSet.Add("object1");
sortedSet.Add("object2");
sortedSet.Add("object1");//會自動去重
int count = sortedSet.Count;
sortedSet.Contains("object1");
HashTable(key-value)類型集合
Hashtable:
拿著key計(jì)算一個(gè)內(nèi)存地址,然后放入key-value。長度不定,可以動態(tài)增加。放入的都是object類型,所以避免不了裝箱拆箱。
//如果不同的key得到相同的內(nèi)存地址,第二個(gè)在前面的地址上+1,由此會形成數(shù)組
//查找的時(shí)候,如果地址對應(yīng)的key不對,那就+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è)線程寫,多個(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形式,自動排序.不能重復(fù)添加,key重復(fù)會報(bào)錯(cuò)
IComparer comparer 自定義對象要排序,就用這個(gè)指定

SortedList sortedList = new SortedList();
sortedList.Add("2", "1");
var keyList = sortedList.GetKeyList();
var valueList = sortedList.GetValueList();
sortedList.TrimToSize();//用于最小化集合的內(nèi)存開銷
sortedList.Remove("1");//根據(jù)key值移除
sortedList.RemoveAt(0);//根據(jù)索引移除
sortedList.Clear();//移除所有元素
字典集合線程不安全(非線程安全),這塊內(nèi)存多個(gè)線程都可以改 ConcurrentQueue 線程安全版本的Queue ConcurrentStack 線程安全版本的Stack ConcurrentBag (List集合是非線程安全的)ConcurrentBag線程安全版本的對象集合 ConcurrentDictionary 線程安全版本的Dictionary BlockingCollection 線程安全集合
ArrayList和List都實(shí)現(xiàn)了IList接口,可以通過索引訪問元素,像鏈表這種就不可以通過索引訪問元素.

但是鏈表這種集合繼承了ICollection類型的接口,因此可獲得集合的長度(長度不定的集合都繼承了ICollection接口)

IEnumerable\ICollection\IList\IQueryable
接口是標(biāo)識功能的.不同的接口拆開就是為了接口隔離.實(shí)現(xiàn)不同的接口表明這個(gè)集合的功能不同.任何數(shù)據(jù)集合都實(shí)現(xiàn)IEnumerable,IEnumerable為不同的數(shù)據(jù)結(jié)構(gòu)(各種集合)提供了統(tǒng)一的數(shù)據(jù)訪問方式(foreach)=》迭代器模式
以上就是C#各類集合匯總的詳細(xì)內(nèi)容,更多關(guān)于c# 集合的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C# WinForm捕獲全局變量異常 SamWang解決方法
本文將介紹C# WinForm捕獲全局變量異常 SamWang解決方法,需要的朋友可以參考2012-11-11
C#利用iTextSharp組件給PDF文檔添加圖片/文字水印
這篇文章主要給大家介紹了關(guān)于如何C#利用iTextSharp組件給PDF文檔添加圖片/文字水印的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Unity游戲開發(fā)中的設(shè)計(jì)模式之策略模式
策略模式是Unity游戲開發(fā)中常用的設(shè)計(jì)模式之一,用于封裝一系列算法或行為,并使這些算法或行為可以相互替換。通過策略模式,可以在運(yùn)行時(shí)動態(tài)地選擇算法或行為,實(shí)現(xiàn)游戲中的多樣性和可擴(kuò)展性。常見的應(yīng)用包括AI行為、武器攻擊、移動方式等2023-05-05
C#中Json字符串的各種應(yīng)用類實(shí)例講解

