当前位置: 首页 > news >正文

手动实现C#ArrayList容器

using System;
using System.Collections;
using System.Text;namespace CSharp进阶
{class ArrayList<T>{private T[] array;private int count;public ArrayList(){count = 0;array = new T[16];}public void Add(T value){//先判断是否需要扩容if(count >=Capcity){//先搬家T[] temp = new T[Capcity * 2];for (int i = 0; i < Capcity ; i++){temp[i] = array[i];}//重新指明方向array = temp;}//不需要扩容,直接加array[count] = value;++count;}public void Remove(T value){int index = -1;//先判断要删的是否存在for (int i = 0; i < Count ; i++){if(array[i] .Equals(value)){//存在index = i;break;}}if(index!=-1){RemoveAt(index);}}public void RemoveAt(int index){//判断索引是否合法if(index<0||index>=Count ){Console.WriteLine("索引不合法");return;}//索引合法for (; index < Count - 1; index++){array[index] = array[index + 1];}array[Count - 1] = default(T);--count;}public int Capcity{get{return array.Length;}}public int Count{get{return count;}}public T this[int index]{get{if (index < 0 || index >= Count){Console.WriteLine("索引不合法");return default (T);}return array[index];}set{if (index < 0 || index >= Count){Console.WriteLine("索引不合法");return;}array[index] = value;}}}class Program{static void Main(string[] args){}}
}

这段代码实现了一个泛型动态数组类ArrayList<T>,它模拟System.Collections.Generic.List<T>的基本功能

  • 泛型设计:使用<T>支持任意类型
  • 底层结构:基于固定大小数组实现动态扩容
  • 容量管理:通过countarray.Length分离实际元素数和总容量

Add方法:

  • 自动扩容机制:当元素数量达到容量上限时
    • 创建新数组(容量翻倍)
    • 复制原有元素到新数组
    • 替换引用
  • 时间复杂度
    • 多数情况 O (1)
    • 扩容时 O (n)
  • Remove 流程
    1. 查找元素位置(通过 Equals 方法)
    2. 调用 RemoveAt 删除
  • RemoveAt 流程
    1. 检查索引合法性
    2. 通过 Array.Copy 前移后续元素覆盖目标元素
    3. 最后位置置为默认值
    4. 元素计数减 1
  • 索引器:通过this[]语法实现类似数组的访问
  • 边界检查:读写时均验证索引范围
  • 默认值处理:越界时返回类型默认值(如 null、0)

设计亮点与优化点

亮点
  1. 泛型实现:类型安全,无需装箱拆箱
  2. 动态扩容:自动管理容量
  3. 索引器支持:使用体验接近原生数组
可优化点
  1. 扩容策略
    • 当前固定倍增(×2)可能导致空间浪费
    • 可改为更灵活的策略(如增长因子)
  2. 异常处理
    • 越界时仅返回默认值,建议抛出IndexOutOfRangeException
  3. 方法完善
    • 缺少ContainsIndexOf等实用方法
    • 未实现IEnumerable<T>接口
  4. 并发安全
    • 多线程环境下需要添加同步机制
http://www.xdnf.cn/news/938629.html

相关文章:

  • Boost ASIO 库深入学习(2)
  • Redis持久化策略:RDB与AOF详解
  • shell脚本 --案例实操
  • cognee,有望替代 RAG, 简单了解一下
  • 服务网格技术深度解析:Istio vs Linkerd的选型对比
  • 【Self-Ask with Search Agent机制概述】利用TavilyAnswer实现搜索代理
  • 【文件传输脚本】
  • XSS攻击防御全指南:核心防护技巧
  • UVM的断言assert详谈
  • 【GESP真题解析】第 17 集 GESP 三级 2024 年 12 月编程题 2:打印数字
  • Linux 基础IO(下)
  • Linux 内核内存管理子系统全面解析与体系构建
  • 基于cornerstone3D的dicom影像浏览器 第三十章 心胸比例测量工具CTRTool
  • 深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
  • 隐函数 因变量确定标准
  • 《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (三)数据格式
  • (LeetCode 动态规划(基础版))96. 不同的二叉搜索树 (递推 || 递归)
  • 自定义连接线程池
  • 【Erdas实验教程】016:遥感图像空间增强(卷积增强)
  • 01.SQL语言概述
  • 华为OD机考- 简单的自动曝光/平均像素
  • (每日一道算法题)验证二叉搜索树
  • 随机算法一文深度全解
  • Dify 工作流全解:模块组成、设计思路与DSL实战指南
  • 【ROS2】核心概念8——参数设置(Parameters)
  • 商家平台AI智能搜索工程实践|RAG|向量检索增强
  • AT_abc409_e [ABC409E] Pair Annihilation
  • 三级流水线是什么?
  • OpenJudge | 大整数乘法
  • 5.子网划分及分片相关计算