详细介绍:C#练习题——泛型实现单例模式和增删改查

news/2025/10/9 19:22:12/文章来源:https://www.cnblogs.com/wzzkaifa/p/19131807

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

实现目标:

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


二、任务一核心代码分析

1. 泛型单例基类设计

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

2. 具体单例类实现

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

3. 单例使用方式

// 通过基类的静态属性访问单例实例
BaseMgr.Instance.value = 100;
BaseMgr.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 BaseMgrwhere T : new()
{
private static T instance=new T();
public static T Instance
{
get { return instance; }
}
}
class Test1 : BaseMgr
{
public int value=1;
}
class Test2 : BaseMgr
{
public string name = "开心超人";
}
static void Main(string[] args)
{
BaseMgr.Instance.value=100;
BaseMgr.Instance.name = "大大怪将军";
}
}
}

(2)设计模式解析

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

实现目标:

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


五、核心代码实现

1. 类定义与字段

class ArrayList
{
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 = count)
{
Console.WriteLine("请输入合法的索引");
return default(T);
}
return arrayList[index];
}
set
{
if (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
{
public T[] arrayList=new T[16];
public int count = 0;//数组的实际容量
public int capacity = 16;
///
/// 增
///
/// 添加的值
public void Add(T value)
{
if(count
/// 删除
///
/// 需要删除的下标
public void Remove(int index)//删
{
if(index>=0&&index
/// 删除(按照值)
///
///
public void RemoveAt(T value)//删
{
int index = -1;
for (int i = 0; i
/// 修改
///
/// 需要修改的下标和修改的值
public void Modify(int index,T value)
{
if(index>=0&&index
/// 查(索引器实现)
///
///
///
public T this[int index]
{
get
{
if (index = count) // ✅ 修正条件判断
{
Console.WriteLine("请输入合法的索引");
return default(T);
}
return arrayList[index];
}
set
{
if (index = count) // ✅ 添加范围检查
{
Console.WriteLine("请输入合法的索引");
return;
}
arrayList[index] = value;
}
}
///
/// 遍历显示数组信息
///
public void Show()//遍历显示数组
{
Console.WriteLine("数组包含{0}个元素", count);
Console.WriteLine("数组容量大小为{0}", capacity);
for (int i = 0; i  array = new ArrayList();
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.mzph.cn/news/933802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ivanti EPM移动版12.5.0.0身份验证绕过漏洞分析与利用

本文详细分析了Ivanti Endpoint Manager Mobile 12.5.0.0版本中的身份验证绕过漏洞(CVE-2025-4428)和表达式语言注入漏洞(CVE-2025-4427),提供了完整的Python利用代码,可实现未授权远程命令执行。Ivanti Endpoint Ma…

自动评估问答模型的技术突破

本文介绍了一种名为AVA的自动问答模型评估方法,采用创新的peer attention机制,在NAACL会议上展示。该方法相比人工评估错误率仅为7%,包含线性模型和基于Transformer的神经网络模型,使用包含200万训练样本的数据集。…

task8.c

task8.cinclude<stdio.h> include<math.h> int main() { double s, a, b, c, area; while (scanf_s("%lf%lf%lf", &a, &b, &c) != EOF) { s = (a + b + c) / 2; area = sqrt(s * (s…

运行Udacity的MPC控制项目指南(project_10)在Ubuntu 18.04环境下

系统更新与工具安装更新系统包列表:打开终端并运行以下命令以确保所有软件包都是最新的。 sudo apt update sudo apt upgrade安装构建工具:安装编译器和构建依赖项。 sudo apt install build-essential cmake git li…

深入解析:Java 将 PDF 转换为 PDF/A:数字文档归档的基石

深入解析:Java 将 PDF 转换为 PDF/A:数字文档归档的基石pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

入门正当时!MQTT协议轻量简洁,但应用绝不简单

MQTT凭借低带宽、低功耗的优势成为物联网通信的基石。尽管协议本身简洁,但其在真实项目中的部署与优化却充满挑战。本教程助你从基础迈向实战。 MQTT——全称Message Queuing Telemetry Transport消息队列遥测传输协议…

MFC中开源布局库---ResizableLib - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

英语阅读

桥梁书: https://zhuanlan.zhihu.com/p/1919350330669397464

JetBrains 官宣 DataGrip 数据库 IDE 现可免费用于非商业用途,适用于 2025.2.4 或更新版本

JetBrains 官宣 DataGrip 数据库 IDE 现可免费用于非商业用途,适用于 2025.2.4 或更新版本JetBrains 官宣 DataGrip 数据库 IDE 现可免费用于非商业用途,适用于 2025.2.4 或更新版本2025/10/3 22:37:36 来源:IT之家…

CF1832D2 Red-Blue Operations (Hard Version) 模拟赛题目分析

CF1832D2 Red-Blue Operations (Hard Version) 题目概述 给你 \(\{a_n\}\),第 \(i\) 次操作,如果是你第奇数次操作当前位置则令它 \(+i\) 否则 \(-i\)。 给出 \(q\) 个询问,问你进行完 \(k\) 个操作之后 \(a\) 中的…

PostgreSQL pg_auto_failover 高可用 1:pg_auto_failover集群搭建

PostgreSQL pg_auto_failover 高可用 1:pg_auto_failover集群搭建 0,pg_auto_failover架构 开始之前,先看一下pg_auto_failover的一个最基础架构原理如下,需要弄清楚几个节点的作用 1,monitor节点纯粹是一个监控…

详细介绍:cpolar让Nastool影音库随身而行,随时随地享受视听自由

详细介绍:cpolar让Nastool影音库随身而行,随时随地享受视听自由pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

网络流最小割,无向图建图法,求最小割点转换求最小割边

洛谷P1345 假设原来的点编号为i,总共有n个点,那么我们就把每个点拆成两个点,编号分别为i和i+n。其中点i负责连接原图中连入这个点的边,点i+n负责连原图中连出这个点的边。 add ( i, i+n, 1 ) ; add ( i+n, i, 0 )…

2025/10/9

2025/10/9学习算法 学习数据结构 写题

看论文随笔Incendio: Priority-Based Scheduling for Alleviating Cold Start in Serverless Computing

基于优先级的无服务器计算冷启动调度 首先摘要: 说明,在无服务器中,冷启动会导致较长的响应延迟。 解决方法是通过减少冷启动的次数来缓解。 然而,现实中,最小冷启动次数并不等于最小响应延迟,根本原因是通过冷启…

深度学习概述 - -一叶知秋

深度学习概述复杂模型 S曲线S曲线改变参数加入更多的Features 例子 1、搭建模型 括号里的作用就是得出 r蚂蚁线内的作用是将 r 通过sigmoid函数,得出 a一个简单的写法最后都乘以 c 加到一起在加 b 得出 y线性代数表示…

C++新语法学习笔记(更新我不会写的新语法)

C++新语法学习笔记(更新我不会写的新语法)顺序填充数组:iota,在头文件numeric中 iota(.begin(), .end(), 参数);//从参数开始填充:参数,参数+1

烧录神器来了!量产工具使用教程,新手也能秒懂

想提升烧录效率?这个量产烧录工具简直是神器!下面为你带来详细上手教程,零基础也能快速掌握,实用干货,免费分享! 本文以Air780EPM开发板为例,演示量产烧录工具的使用步骤。 最新量产烧录工具使用指南详见: htt…

深入解析:C++基础(21)——内存管理

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

C#性能优化基础:内存诊断(dump)

接上一篇:C#性能优化基础:垃圾回收机制本文说下怎么去查找内存问题,举个例子,我们有这样的一段程序:namespace ConsoleApp1{internal class Program{static List<Demo> Demos { get; } = new List<Demo&…