小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C# 數(shù)據(jù)容器詳解:Array、List、Dictionary、LinkedList、Queue、Stack

 黃金屋1 2022-06-05 發(fā)布于北京

前言

在Unity有一個(gè)與數(shù)據(jù)容器息息相關(guān)的命名空間:System.Collections.Generic,其包含用于定義泛型集合的接口和類,可允許用戶創(chuàng)建強(qiáng)類型集合,以提供比非泛型強(qiáng)類型集合更好的類型安全性和性能

本篇博客用來介紹這些通過泛型實(shí)現(xiàn)的安全類型的數(shù)據(jù)容器(ArrayList是一個(gè)例外),話不多說,直接開始


Array

特點(diǎn):

數(shù)組是一種線性結(jié)構(gòu),需要聲明長度
   通過下標(biāo)查找時(shí)間復(fù)雜度為O(1)
   插入刪除比較復(fù)雜

常用屬性:

  • Length:獲取出數(shù)組所有維度的長度

  • Rank:獲取數(shù)組的維度

方法:

  • Clear(Array, Int32, Int32):在指定數(shù)組的某一范圍將數(shù)組恢復(fù)為默認(rèn)值(比如整數(shù)數(shù)組歸零)

  • Sort(Array):對(duì)于數(shù)組中的元素進(jìn)行排序

  • Clone():創(chuàng)建Array副本

  • GetType():獲取當(dāng)前數(shù)組實(shí)例的Type

  • Initialize():通過調(diào)用值類型的無參數(shù)構(gòu)造函數(shù),初始化值類型 Array 的每一個(gè)元素

  • Reverse(Array):反轉(zhuǎn)數(shù)組中元素的順序

使用方式:

通過下面的代碼來理解一些關(guān)鍵屬性方法的使用方式:

int[] nums = new int[] { 2, 7, 11, 15 };

        //leangth來獲取數(shù)組的長度
        Console.WriteLine(nums.Length);

        //對(duì)數(shù)組中元素進(jìn)行排序
        Array.Sort(nums);

        //反轉(zhuǎn)數(shù)組中元素的順序
        Array.Reverse(nums);
       

        //復(fù)制nums數(shù)組
        int[] nums_Copy = (int[])nums.Clone();

        //清除數(shù)組元素,將nums中所有元素變?yōu)?
        Array.Clear(nums, 0, nums.Length);

        //同樣將數(shù)組中元素恢復(fù)默認(rèn)
        nums.Initialize();

ArrayList

ArrayList核心是數(shù)組,但是是在數(shù)組的基礎(chǔ)上進(jìn)行了擴(kuò)展,首先就是其動(dòng)態(tài)擴(kuò)容的特點(diǎn),然后再一定程度上同日出生了其查詢速度

ArrayList的使用需要引入命名方法:using System.Collections;

特點(diǎn):

  • 可以動(dòng)態(tài)擴(kuò)容:通過創(chuàng)建一個(gè)更大的新數(shù)組,來將原來的數(shù)組轉(zhuǎn)移到新數(shù)組

  • 插入刪除比數(shù)組方便

  • 類似于數(shù)組,同樣通過下標(biāo)索引

存儲(chǔ)的是對(duì)象:

  • 需要裝箱、拆箱操作

  • 是不安全類型

注意

  • 裝箱:將值類型轉(zhuǎn)換為引用類型(隱式轉(zhuǎn)換)

  • 拆箱:將引用類型轉(zhuǎn)換為值類型(顯式轉(zhuǎn)換)

屬性

  • Capacity:獲取或者設(shè)置ArrayList中可以包含的元素個(gè)數(shù)

  • Count:獲取ArrayList中實(shí)際包含的元素個(gè)數(shù)

  • ArrayList[]:通過下標(biāo)索引


方法

  • Add:添加元素在ArrayList的尾部

  • Clear:清除所有元素

  • Contains:確定某個(gè)元素是否在ArrayList內(nèi)

  • Sort:排序

使用方式

關(guān)于ArrayList使用方式有很多與Array相同,可以通過如下案例看出:

//創(chuàng)建
        ArrayList m_arrayList = new ArrayList();
        
        ArrayList al = new ArrayList { 1, 2, 3, 4 };
        //元素插入
        m_arrayList.Add("001");
        m_arrayList.Add(1);

        //第一中遍歷方式
        for(int i=0;i<m_arrayList.Count;i++)
        {
            Console.WriteLine(m_arrayList[i]);
        }
        //第二種遍歷方式
        foreach(Object j in m_arrayList)
        {
            Console.WriteLine(j);
        }

List

List就是通過將泛型數(shù)據(jù)存儲(chǔ)在一個(gè)泛型數(shù)組中,從而實(shí)現(xiàn)一個(gè)數(shù)據(jù)安全類型的列表,添加元素時(shí)若超過中當(dāng)前泛型數(shù)組的容量,則進(jìn)行二倍擴(kuò)容,進(jìn)而實(shí)現(xiàn)List大小動(dòng)態(tài)變化

特點(diǎn):

核心是數(shù)組:

  • 可以動(dòng)態(tài)擴(kuò)容:同樣是創(chuàng)建新的更大數(shù)組來遷移數(shù)據(jù)

  • 使用泛型來實(shí)現(xiàn)對(duì)裝箱拆箱操作的避免

內(nèi)存優(yōu)化:

  • 對(duì)于List可以規(guī)定長度,來避免動(dòng)態(tài)擴(kuò)容操作,這樣就可以避免新的內(nèi)存空間的消耗

  • 相對(duì)于ArrayList,List避免了裝箱拆箱操作,性能表現(xiàn)更好

屬性:

  • Capacity:獲取或設(shè)置該內(nèi)部數(shù)據(jù)結(jié)構(gòu)在不調(diào)整大小的情況下能夠容納的元素總數(shù)。

  • Count:獲取 List 中包含的元素?cái)?shù)。

  • Item[Int32]:獲取或設(shè)置指定索引處的元素。

方法:

  • Add:添加元素在List的尾部

  • Clear:清除所有元素

  • Contains:確定某個(gè)元素是否在List內(nèi)

  • Sort:排序

使用方式

通過上面的屬性方法,也可以看出其使用方式于ArrayList差不多

//創(chuàng)建一個(gè)列表,長度確定的情況下可以規(guī)定長度,減少new的產(chǎn)生
        List<int> nums = new List<int>(12);


        //向列表插入數(shù)據(jù)
        nums.Add(1);
        nums.Add(2);

        //遍歷列表元素

        for(int i=0;i<nums.Count;i++)
        {
            Console.WriteLine(nums[i]);
        }

        foreach(int num in nums)
        {
            Console.WriteLine(num);

        }
        //判斷某一個(gè)元素是否在列表中
        if(nums.Contains(1))
        {
            Console.WriteLine("1在列表nums中");
        }

        //排序
        nums.Sort();

HashTable

特點(diǎn)

  • HashTable類似于字典,也是鍵值對(duì)的形式

  • 查詢速度快,插入速度慢

  • 容量固定,根據(jù) 數(shù)組索引獲得值

//哈希表結(jié)構(gòu)體
private struct bucket {
   	public Object key;//鍵
    public Object values;//值
    public int hashCode;//哈希碼
}

原理:

  • 不定長的二進(jìn)制數(shù)據(jù)通過哈希函數(shù)映射到一個(gè)較短的二進(jìn)制數(shù)據(jù)集,即Key通過HashFunction函數(shù)獲得HashCode

  • 但是這樣的HashCode依舊很長, 不方便索引,于是又將這些HashCode通過哈希桶算法進(jìn)行分段(一般都是取余數(shù)),這樣就會(huì)減小每一段的索引距離


LinkedList

特點(diǎn):

  • 鏈表插入刪除方便,查找相對(duì)于數(shù)組來說比較慢

  • 為了解決線性表的刪除問題,對(duì)于數(shù)組,列表,數(shù)組列表插入刪除是很復(fù)雜的一件事,而鏈表則不需要對(duì)于其進(jìn)行遍歷,即可實(shí)現(xiàn)其遍歷過程

  • 鏈表通過遞歸實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)

其屬性方法:

屬性:

  • Count:包含的節(jié)點(diǎn)數(shù)

  • First:獲取鏈表的第一個(gè)節(jié)點(diǎn)

  • Last:獲取鏈表的最后一個(gè)節(jié)點(diǎn)

方法:

  • AddFirst(T):開頭處添加指定值的節(jié)點(diǎn)

  • AddLast(T):結(jié)尾處添加指定的節(jié)點(diǎn)

  • Clear():移除所有的節(jié)點(diǎn)

  • Contains(T):判斷是否包含某一個(gè)值

  • FInd(T):查找包含值的第一個(gè)節(jié)點(diǎn)

  • FIndLast(T):查找包含值的最后一個(gè)節(jié)點(diǎn)

  • Remove():移除指定值的第一個(gè)匹配項(xiàng)

  • RemoveFirst():移除位于開頭的節(jié)點(diǎn)

  • RemoveLast():移除位于結(jié)尾處的節(jié)點(diǎn)



Dictionary

Dictionary<TKey,TValue>泛型類提供一組鍵到一組值的映射。 每次對(duì)字典的添加都包含一個(gè)值和與其關(guān)聯(lián)的鍵。 使用其鍵檢索值的速度非???,接近 O (1) ,因?yàn)?Dictionary<TKey,TValue>該類是作為哈希表實(shí)現(xiàn)的

字典在C#中是一種很常用的數(shù)據(jù)容器,在Unity中有很多的應(yīng)用場景,尤其是框架階段,如下:

  • 事件管理器

  • UI界面管理器

  • 有限狀態(tài)機(jī)

  • 資源加載器

  • 對(duì)象池

特點(diǎn):

  • 索引方便,時(shí)間復(fù)雜度接近O(1)

  • 是安全類型

  • 鍵唯一

屬性:

  • Count:獲取字典中包含的鍵值對(duì)的個(gè)數(shù)

  • Keys:獲取字典中包含鍵的集合

  • Values:獲取字典中包含的值的集合

方法:

  • Add(Key,Value):添加鍵值對(duì)

  • Clear():移除字典中所有鍵值對(duì)

  • ContainsKey(Key):判斷字典中是否有該鍵

  • ContainsValue(Value):判斷字典中是否有該值

  • Remove(Key):從字典中移除指定鍵的值

  • Remove(Key,Value):從元素中移除指定鍵的值,并復(fù)制給Value

  • TryAdd(Key,Value):嘗試將鍵值對(duì)插入到字典中,如果成功則返回True

使用方式:

關(guān)于字典的使用方式還是比較復(fù)雜的,主要是兩個(gè)變量以及兩者之間的對(duì)應(yīng)關(guān)系的理解

//創(chuàng)建一個(gè)字典
        Dictionary<string, string> peoples = new Dictionary<string, string>();


        //插入鍵值對(duì)
        if(!peoples.ContainsKey("小明"))
        {
            peoples.Add("小明", "男");
            peoples.Add("小紅", "女");
        }

        //遍歷字典中所有的鍵,同樣可以遍歷所有的值
        Dictionary<string,string>.KeyCollection keys = peoples.Keys;
        foreach(string s in keys)
        {
            Console.WriteLine(s);
        }

        //遍歷字典并輸出鍵和值
        foreach (KeyValuePair<string, string> kv in peoples)
        {
            Console.WriteLine(kv.Key);
            Console.WriteLine(kv.Value);
        }

        //修改鍵值對(duì)的值
        if (peoples.ContainsKey("小明"))
        {
            peoples["小明"] = "女";
        }

        //刪除鍵值對(duì)
        if (peoples.ContainsKey("小明"))
        {
            peoples.Remove("小明");
        }

Queue

隊(duì)列的特點(diǎn)是先進(jìn)先出,主要是應(yīng)用在一些特殊的場景,需要實(shí)現(xiàn)數(shù)據(jù)的一個(gè)先進(jìn)先出的效果

特點(diǎn):

  • 先進(jìn)先出

屬性:

  • Count:獲取 Queue<T>中包含的元素?cái)?shù)
    方法:

  • Clear():從 Queue<T>中移除所有對(duì)象。

  • Contains(T):確定某元素是否在Queue<T>中。

  • CopyTo(T[], Int32):從指定數(shù)組索引開始將Queue<T>元素復(fù)制到現(xiàn)有一維Array中。

  • Dequeue():移除并返回位于Queue<T>開始處的對(duì)象。

  • Enqueue(T):將對(duì)象添加到 Queue<T>的結(jié)尾處。

Stack

特點(diǎn):

  • 先進(jìn)后出

  • 底層數(shù)組,兩倍動(dòng)態(tài)擴(kuò)容

屬性:

  • Count:獲取 Stack 中包含的元素?cái)?shù)。

方法

  • Clear(): 從 Stack<T>中移除所有對(duì)象。

  • Contains(T):確定某元素是否在Stack<T>

  • Peek():返回位于 Stack<T>頂部的對(duì)象但不將其移除。

  • Pop():刪除并返回Stack<T>頂部的對(duì)象。

  • Push(T):在 Stack<T>的頂部插入一個(gè)對(duì)象。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多