欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#各類集合匯總

 更新時(shí)間:2020年07月13日 11:21:08   作者:江北  
這篇文章主要介紹了C#各類集合的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

集合(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#中Json字符串的各種應(yīng)用類實(shí)例講解

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

    這篇文章主要介紹了C#中Json字符串的各種應(yīng)用類實(shí)例講解的相關(guān)資料,需要的朋友可以參考下
    2015-10-10
  • C#?VB.NET?將Html轉(zhuǎn)為Excel

    C#?VB.NET?將Html轉(zhuǎn)為Excel

    本文介紹通過(guò)C#和VB.NET代碼展示將Html轉(zhuǎn)為Excel文檔的方法。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定幫助,感興趣的小伙伴可以了解一下
    2022-03-03
  • C#文件上傳的簡(jiǎn)單實(shí)現(xiàn)

    C#文件上傳的簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了C#文件上傳的簡(jiǎn)單實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 基于C# MBG 擴(kuò)展方法類庫(kù)的使用詳解

    基于C# MBG 擴(kuò)展方法類庫(kù)的使用詳解

    本篇文章對(duì)C# MBG 擴(kuò)展方法類庫(kù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 最新評(píng)論