C#基础之List内核结构

不确定能写多少,能写多少写多少,也是基本常用到的一些,像BinarySerach这些就没写出来,如果有这方面的书籍,麻烦留言告诉我一下,我自己找不到……谢谢


文章目录

        • 基本数据
        • 构造函数
        • 字段:
          • Capacity
          • Count
          • [index]
        • 函数
          • Add(T item)
          • AddRange(IEnumberable< T > collection)
          • InsertRange(int index, IEnumerable< T > collection)
          • Clear()
          • Contains(T item)
          • CopyTo(*****)
          • FindIndex(int startIndex, int count, Predicate< T > match)
          • FindIndex(int startIndex, Predicate< T > match)
          • FindIndex(Predicate< T > match)
          • Exists(Predicate< T > match)
          • Find(Predicate< T > match)
          • FindAll(Predicate< T > match)
          • FindLast(Predicate< T > match)
          • ForEach(Action< T > action)
          • GetRange(int index, int count)
          • Insert(int index, T item)
          • Remove(T item)
          • RemoveAt(int index)
          • RemoveRange(int index, int count)
          • ToArray()
          • Sort()

基本数据

继承了 X 个接口,给自己挖坑,接口留着以后说C#基础之List内核结构_第1张图片
可以看到,默认初始容量为 4 ,使用 数组T[] 存储相应的数据

构造函数

默认构造函数,直接返回一个静态、只读、长度为0 的数组
在这里插入图片描述
带 容量 (Capacity ) 的构造函数,容量 Capacity 非负
C#基础之List内核结构_第2张图片
带 集合 IEnumerable collection 的参数,collection 不能为null
C#基础之List内核结构_第3张图片
最后一行为空时,仍执行Add,若为引用类型,是可以将null添加到末尾的

字段:
Capacity

get 直接返回items.length,即数组长度
set 当容量<已存数据长度,发生异常,原因是重新设置容量时,如果列表已存在数据,将发生数组的复制。所以设置容量>数据长度时,申请新的数组,将原有数组复制过去
C#基础之List内核结构_第4张图片

Count

返回字段_size

[index]

返回、设置数组 this._items[index] 的值,当set时,版本_version增一
C#基础之List内核结构_第5张图片

函数
Add(T item)

确保空间够,不够基本以原有的 2 倍扩展
C#基础之List内核结构_第6张图片
添加到末端,版本增一
C#基础之List内核结构_第7张图片

AddRange(IEnumberable< T > collection)

调用 InsertRange(this._size, collection)

InsertRange(int index, IEnumerable< T > collection)

做安全性校验后,先把要插入的位置后的数据复制到后collection.Count的位置,再开辟新数组存储要插入的数据,再将数据插入到指定位置
C#基础之List内核结构_第8张图片

Clear()

每一个数值置默认值,_size 为 0

Contains(T item)

遍历一遍,时间复杂度O(n)

CopyTo(*****)

直接使用Array.Copy(*****)

FindIndex(int startIndex, int count, Predicate< T > match)

最基本的FindIndex,供其他Find Exists FindIndex调用
作一遍遍历,使用 match 函数作匹配,时间复杂度O(n)
C#基础之List内核结构_第9张图片

FindIndex(int startIndex, Predicate< T > match)

在这里插入图片描述

FindIndex(Predicate< T > match)

在这里插入图片描述

Exists(Predicate< T > match)

在这里插入图片描述

Find(Predicate< T > match)

C#基础之List内核结构_第10张图片

FindAll(Predicate< T > match)

时间O(n),申请List默认空间为4,使用默认空间可能发生频繁的数组复制操作
C#基础之List内核结构_第11张图片

FindLast(Predicate< T > match)

逆序遍历,时间复杂度O(n)
C#基础之List内核结构_第12张图片

ForEach(Action< T > action)

为每一个数据执行action操作
C#基础之List内核结构_第13张图片

GetRange(int index, int count)

申请空间为 count 的列表C#基础之List内核结构_第14张图片

Insert(int index, T item)

直接插入,数组后this._size - index位后移一位
C#基础之List内核结构_第15张图片

Remove(T item)

先查找Item的下标,然后通过下标移除
C#基础之List内核结构_第16张图片

RemoveAt(int index)

C#基础之List内核结构_第17张图片

RemoveRange(int index, int count)

C#基础之List内核结构_第18张图片

ToArray()

申请新的数组空间,赋值返回

Sort()

Sort 排序,该结构自身不作实现
通过调用Array中的静态排序方法,而Array调用ArraySortHelper中的排序
C#基础之List内核结构_第19张图片
_V4_5 表示框架的版本
该排序综合了多个排序,包括堆排序、快排等等

你可能感兴趣的:(C#,List,内核,结构)