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

C#练习题——泛型实现单例模式和增删改查

一、任务一:使用栈结构方式实现十进制转化为二进制

实现目标:

(1)用泛型实现一个单例模式基类


二、任务一核心代码分析

1. 泛型单例基类设计

class BaseMgr<T> where T : new()  // 约束T必须有无参构造函数
{private static T instance = new T();  // 静态实例,类加载时创建public static T Instance{get { return instance; }  // 提供全局访问点}
}

2. 具体单例类实现

class Test1 : BaseMgr<Test1>  // 继承泛型基类,自身作为类型参数
{public int value = 1;
}class Test2 : BaseMgr<Test2>
{public string name = "开心超人";
}

3. 单例使用方式

// 通过基类的静态属性访问单例实例
BaseMgr<Test1>.Instance.value = 100;
BaseMgr<Test2>.Instance.name = "大大怪将军";

三、任务一完整代码以及设计模式解析

(1)完整代码

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Xml.Linq;namespace 进阶测试
{class Program{class BaseMgr<T>where T : new(){private static T instance=new T();public static T Instance{get { return instance; }}}class Test1 : BaseMgr<Test1>{public int value=1;}class Test2 : BaseMgr<Test2>{public string name = "开心超人";}static void Main(string[] args){BaseMgr<Test1>.Instance.value=100;BaseMgr<Test2>.Instance.name = "大大怪将军";}}
}

(2)设计模式解析

四、任务二:利用泛型知识点,仿造ArrayList实现一个不确定数组类型的类实现增删查改方法

实现目标:

(1)用泛型实现实现一个不确定数组类型的类实现增删查改


五、核心代码实现

1. 类定义与字段

class ArrayList<T>
{public T[] arrayList = new T[16];public int count = 0;    // 数组的实际元素数量public int capacity = 16; // 数组的当前容量
}

2. 添加功能 (Add)

public void Add(T value)
{if (count < capacity){arrayList[count] = value; count++;}else{// 扩容操作:容量翻倍T[] newarray = new T[capacity *= 2];for (int i = 0; i < arrayList.Length; i++){newarray[i] = arrayList[i];}newarray[count] = value; // 注意:这里修正了原代码的错误count++;arrayList = newarray;}
}

当数组未满时,直接添加元素

当数组已满时,创建容量翻倍的新数组并拷贝元素

时间复杂度:平均 O(1),最坏情况(需要扩容时)O(n)


3. 删除功能 (Remove)

(1)按索引删除:

public void Remove(int index)
{if (index >= 0 && index < count){for (int i = index; i < count - 1; i++){arrayList[i] = arrayList[i + 1];}// 清空最后一个元素的引用(避免内存泄漏)arrayList[count - 1] = default(T);count--; // 减少实际元素计数}
}

(2)按值删除:

public void RemoveAt(T value)
{int index = -1;for (int i = 0; i < count; i++){if (arrayList[i].Equals(value)){index = i; // 保留相等的下标位置break;}}if (index != -1){Remove(index);}else{Console.WriteLine("数组中没有找到值为{0}", value);}
}

4. 修改功能 (Modify)

public void Modify(int index, T value)
{if (index >= 0 && index < count)arrayList[index] = value;else{Console.WriteLine("请输入正确的下标");return; }
}

5. 查询功能(索引器)

public T this[int index]
{get{if (index < 0 || index >= count){Console.WriteLine("请输入合法的索引");return default(T);}return arrayList[index];}set{if (index < 0 || index >= count){Console.WriteLine("请输入合法的索引");return;}arrayList[index] = value;}
}

6. 显示数组信息

public void Show()
{Console.WriteLine("数组包含{0}个元素", count);Console.WriteLine("数组容量大小为{0}", capacity);for (int i = 0; i < count; i++){Console.WriteLine(arrayList[i]);}
}

六、任务二实现原理分析

1. 动态扩容机制
当数组元素数量达到当前容量时,创建一个容量翻倍的新数组,并将原有元素拷贝到新数组中。这种策略保证了添加操作的平均时间复杂度为 O(1)。

2. 内存管理
在删除元素时,需要将删除位置后的所有元素向前移动一位,并将最后一个元素设置为默认值,避免内存泄漏。

3. 泛型支持
使用泛型类型参数 T,使得该数组可以存储任何类型的元素,同时保持类型安全


七、任务二完整代码

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Xml.Linq;namespace 进阶测试
{class ArrayList<T>{public T[] arrayList=new T[16];public int count = 0;//数组的实际容量public int capacity = 16;/// <summary>/// 增/// </summary>/// <param name="value">添加的值</param>public void Add(T value){if(count< capacity){arrayList[count]=value; count++;}else{T[] newarray = new T[capacity*=2];for (int i = 0; i < arrayList.Length; i++){newarray[i] = arrayList[i];}newarray[capacity - 1] = value;//把待添加的值传给数组count++;arrayList = newarray;}}/// <summary>/// 删除/// </summary>/// <param name="index">需要删除的下标</param>public void Remove(int index)//删{if(index>=0&&index<count)//确保下标在正确的范围内{for (int i = index; i < count - 1; i++) // ✅ 使用局部变量i{arrayList[i] = arrayList[i + 1];}}// 清空最后一个元素的引用(避免内存泄漏)arrayList[count - 1] = default(T);count--; // 减少实际元素计数}/// <summary>/// 删除(按照值)/// </summary>/// <param name="value"></param>public void RemoveAt(T value)//删{int index = -1;for (int i = 0; i < count; i++){if (arrayList[i].Equals(value)){index=i; //保留相等的下标位置break;}}if(index!=-1){Remove(index);}else{Console.WriteLine("数组中没有找到值为{0}",value);}}/// <summary>/// 修改/// </summary>/// <param name="index">需要修改的下标和修改的值</param>public void Modify(int index,T value){if(index>=0&&index<count)arrayList[index]=value;else{Console.WriteLine("请输入正确的下标");return; }}/// <summary>/// 查(索引器实现)/// </summary>/// <param name="index"></param>/// <returns></returns>public T this[int index]{get{if (index < 0 || index >= count) // ✅ 修正条件判断{Console.WriteLine("请输入合法的索引");return default(T);}return arrayList[index];}set{if (index < 0 || index >= count) // ✅ 添加范围检查{Console.WriteLine("请输入合法的索引");return;}arrayList[index] = value;}}/// <summary>/// 遍历显示数组信息/// </summary>public void Show()//遍历显示数组{Console.WriteLine("数组包含{0}个元素", count);Console.WriteLine("数组容量大小为{0}", capacity);for (int i = 0; i < count; i++){Console.WriteLine(arrayList[i]);}}}class Program{static void Main(string[] args){ArrayList<int> array = new ArrayList<int>();Console.WriteLine("*********增加***********");array.Add(1);array.Add(2);array.Add(4);array.Add(5);array.Add(26);array.Show();Console.WriteLine("**********修改**********");array.Modify(1, 999);array.Show();Console.WriteLine("***********删除(下标)*********");array.Remove(0);array.Show();Console.WriteLine("***********删除(值)*********");array.RemoveAt(999);array.Show();Console.WriteLine("***********查看*********");Console.WriteLine(array[0]);Console.WriteLine(array[1]);Console.WriteLine(array[2]);}}
}
http://www.dtcms.com/a/392338.html

相关文章:

  • 网关登录校验
  • Kubernetes Fluent Bit Pod Pending 问题解决方案
  • 我爱学算法之—— 位运算(中)
  • 什么是差分信号
  • 相机标定(Camera Calibration)原理及步骤:从 “像素模糊” 到 “毫米精准” 的关键一步
  • 用 【C# + WinUI3 + 图像动画】 来理解:高数 - 函数 - 初等函数
  • ​​[硬件电路-296]:单刀双掷(SPDT)模拟开关
  • 【MAVLink】MAVSDK编程入门、基本概念
  • MAC-基于反射的枚举工具类优化
  • 防御性编程:编程界的‘安全驾驶‘指南
  • Qt绘图方式有哪些
  • 使用python创建、管理、分析和可视化“欲望”之间的关系网络图
  • 铸铁平台:工业制造的基石与精密测量的核心
  • Mac环境安装Nginx指南实录
  • 《RAG是什么?为什么它比微调更适合让AI拥有“专业知识”?》
  • 【Python】控制台界面演示
  • 软考中级习题与解答——第九章_信息安全(2)
  • [新启航]民航发动机燃油喷嘴的多孔阵列孔深光学 3D 轮廓测量 - 激光频率梳 3D 轮廓技术
  • 【测试开发/测试】详解测试用例(下):详解设计测试用例的方法
  • Go基础:Go语言错误和异常详解
  • kubeadm部署K8S单master架构实战
  • npx命令介绍(Node Package Execute)(允许开发者直接执行来自npm注册表的包中的二进制文件,而无需全局安装)临时使用
  • LeetCode 3508.设计路由器:STL套STL——有什么需求就设计什么数据结构
  • 基本排序算法
  • 学习Python中Selenium模块的基本用法(15:窗口操作)
  • 能力(1)
  • UE4/UE5 如何迁移HotPatcher插件
  • SQL从入门到起飞:完整数据库操作练习
  • MyBatis 从入门到进阶:数据库操作全指南
  • spring cloud 同一服务多实例 websocket跨实例无法共享Session 的解决