最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中List<T>存放元素的工作機制

 更新時間:2022年08月11日 08:46:38   作者:Darren?Ji  
這篇文章介紹了C#中List<T>存放元素的工作機制,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

List<T>是怎么存放元素?我們扒一段List<T>的一段源碼來一窺究竟。

using System;
using System.Diagnostic;
using System.Collections.ObjectModel;
using System.Security.Permissions;

namespace System.Collections.Generic
{
    ...
    [Serializable()]
    public class List<t> : IList<t>, System.Collections.IList
    {
        private const int _defaultCapacity = 4;
        private T[] _items; //List<T>內(nèi)部是依靠數(shù)組_items存放數(shù)據(jù)的
        private int _size; //數(shù)組的長度
        private int _version;
        [NoSerialized]
        private Object _syncRoot;
        static T[] _emptyArray = new T[0];

        //無參數(shù)構(gòu)造函數(shù) 把_items設(shè)置成一個空的數(shù)組
        public List()
        {
            _items = _emptyArray;
        }

        //此構(gòu)造函數(shù) 給_items數(shù)組一個初始容量
        public List(int capacity)
        {
            ...
            items = new T[capaicty];
        }

        //此構(gòu)造函數(shù) 把集合類型參數(shù)拷貝給_items數(shù)組
        public List(IEnumerable<t> collection)
        {
            ...
            ICollection<t> c = collection as ICollection<t>;
            if(c != null)
            {
                int count = c.Count; //把構(gòu)造函數(shù)集合類型參數(shù)的長度賦值給臨時變量count
                _items = new T[count]; //List<T>內(nèi)部維護的_items數(shù)組的長度和構(gòu)造函數(shù)集合類型參數(shù)的長度一致
                c.CopyTo(_items, 0); //把構(gòu)造函數(shù)集合的所有元素拷貝到_items數(shù)組中去
                _size = count; //_items數(shù)組的長度就是構(gòu)造函數(shù)集合類型參數(shù)的長度
            }
            else
            {
                _size = 0;
                _items = new T[_defaultCapacity];
                ...
            }
        }

        //通過設(shè)置這個屬性,改變List<t>內(nèi)部維護的_items數(shù)組的長度
        public int Capacity
        {
            get {return _items.Length; }
            set {
                if(value != _items.Length){ //如果當前賦值和List<t>維護的內(nèi)部數(shù)組_items長度不一致
                    if(value < _size){
                        //TODO: 處理異常
                    }
                    if(value > 0){
                        T[] newItems = new T[value]; //創(chuàng)建一個臨時的、新的數(shù)組,長度為新的賦值
                        if(_size > 0){
                            //把臨時的、新的數(shù)組拷貝給List<t>內(nèi)部維護的數(shù)組_items,注意,這時_items的長度為新的賦值
                            Array.Copy(_items, 0, newItems, 0, _size); 
                        }
                    } else {
                        _items = _emptyArray;
                    }
                }
            }
        }

        public void Add(T item)
        {
            if(_size == _items.Length) EnsureCapacity(_size + 1);
            _items[_size++] = item;
            ...
        }

        //確保List<t>內(nèi)部維護的_items數(shù)組的長度至少是給定的值
        //如果_items數(shù)組原先的長度比給定的值小,就讓_items數(shù)組的長度設(shè)置為原先的長度的2倍
        privat void EnsureCapacity(int min)
        {
            if(_items.Length < min){
                 int newCapacity = _items.Length == 0 ? _defaultCapacity : _items.Legnth * 2;
                 if(newCapacity < min) newCapacity = min;
                 Capacity = newCapacity;
            }
        }

    }
}

由此可見,向List<T>中存放元素的大致過程是這樣的:

  • List<T>內(nèi)部維護著一個數(shù)組_items,用來存放T類型的元素。
  • 當有新的T類型元素存放進來,即調(diào)用Add(T item)方法。
  • Add(T item)方法內(nèi)部調(diào)用EnsureCapacity(int min)方法確保List<T>的Capaicty屬性值至少在原先長度上加1,最多是原先長度的2倍。
  • 在給Capacity賦值的過程中,對_items的長度進行了擴容。
  • 擴容后,再把新的T類型元素存放進來。

簡單地說:

當有新的元素存放到List<T>中時,List<T>先對其維護的內(nèi)部數(shù)組進行擴容,然后再把新元素放進來。

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • C#RSA對接JAVA中RSA方式代碼實例

    C#RSA對接JAVA中RSA方式代碼實例

    在本篇文章中小編給各位整理的是關(guān)于C#RSA對接JAVA中RSA方式代碼實例,有需要的朋友們可以參考一下。
    2019-09-09
  • 深入Unix時間戳與C# DateTime時間類型互換的詳解

    深入Unix時間戳與C# DateTime時間類型互換的詳解

    本篇文章是對Unix時間戳與C# DateTime時間類型互換進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • 詳解C#如何優(yōu)雅地終止線程

    詳解C#如何優(yōu)雅地終止線程

    在大多情況下,我們只關(guān)心線程的創(chuàng)建與啟動,運行,卻并不關(guān)心線程的結(jié)束或者終止。今天這篇文章,我們就以一些簡單的小例子,簡述如何有效的停止線程,僅供學(xué)習分享使用,如有不足之處,還請指正
    2023-03-03
  • WPF微信聊天和通訊錄按鈕樣式代碼分享

    WPF微信聊天和通訊錄按鈕樣式代碼分享

    這篇文章主要為大家分享了WPF微信聊天和通訊錄按鈕樣式代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • C#優(yōu)化if...else代碼的方案總結(jié)

    C#優(yōu)化if...else代碼的方案總結(jié)

    在編寫代碼實現(xiàn)業(yè)務(wù)需求過程中,會使用到大量的if...else 判斷語句,隨業(yè)務(wù)復(fù)雜程度不同,導(dǎo)致判斷語句出現(xiàn)多層嵌套、多分支等情況,導(dǎo)致代碼可讀性變差、增加維護難度,本文介紹了C# 如何優(yōu)化 if...else 讓代碼優(yōu)雅起來,需要的朋友可以參考下
    2024-06-06
  • c#linq里的Skip和Take實現(xiàn)分頁或遍歷

    c#linq里的Skip和Take實現(xiàn)分頁或遍歷

    LINQ的優(yōu)勢在于它提供了一種直觀、類型安全的方式來操作各種類型的數(shù)據(jù),查詢常需要獲取一部分數(shù)據(jù),為了實現(xiàn)這一功能,LINQ提供了Take?和Skip運算符,Take運算符用于從一個序列中返回指定個數(shù)的元素,Skip運算符用于從一個序列中跳過指定個數(shù)的元素
    2024-01-01
  • 基于C#中XmlReader讀取Xml的深入分析

    基于C#中XmlReader讀取Xml的深入分析

    本篇文章是對C#中XmlReader讀取Xml進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 詳解C#中對于接口的實現(xiàn)方式(隱式接口和顯式接口)

    詳解C#中對于接口的實現(xiàn)方式(隱式接口和顯式接口)

    這篇文章主要介紹了詳解C#中對于接口的實現(xiàn)方式(隱式接口和顯式接口),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2019-12-12
  • visio二次開發(fā)--判斷文檔是否已發(fā)生變化(變化就加星號*)

    visio二次開發(fā)--判斷文檔是否已發(fā)生變化(變化就加星號*)

    最近做一個故障樹診斷的項目,用visio二次開發(fā),可以同時打開多個繪制的故障樹圖形文檔。項目中需要實現(xiàn)判斷文檔是否發(fā)生變化,這是很多編輯軟件的基本功能,變化了就加個星號*
    2013-04-04
  • C#學(xué)習教程之Socket的簡單使用

    C#學(xué)習教程之Socket的簡單使用

    這篇文章主要給大家介紹了關(guān)于C#學(xué)習教程之Socket的簡單使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面來一起學(xué)習學(xué)習吧
    2019-02-02

最新評論

疏勒县| 旬阳县| 海口市| 邻水| 明溪县| 永济市| 社会| 苗栗县| 岳阳市| 云龙县| 吉林省| 玉屏| 福安市| 云梦县| 汉源县| 甘孜| 新巴尔虎左旗| 漳平市| 巴东县| 黔江区| 海口市| 本溪| 湖南省| 桑植县| 民丰县| 德州市| 通城县| 渭南市| 海门市| 赤水市| 宜川县| 微博| 阿巴嘎旗| 准格尔旗| 南宫市| 长乐市| 汶上县| 瓦房店市| 原阳县| 临清市| 万山特区|