C#_创建自己的MyList列表

定义一个数据自己的列表MyList  使用上述描述列表的方式(数组)  列表内也要定义属于自己的方法  例如 Sort排序 Add添加 等等....

思路

┌─────────────────────────────────────────────────────────────────┐
│                    开始:实现 MyList<T> 泛型类                    │
└───────────────────────────────────┬─────────────────────────────┘↓
┌─────────────────────────────────────────────────────────────────┐
│                1. 定义核心成员(存储与计数)                       │
│  ┌───────────────┐    ┌───────────────┐                         │
│  │  private T[] data  │    │  private int count  │              │
│  │  (内部存储数组)  │    │  (实际元素数量)   │                  │
│  └───────────────┘    └───────────────┘                         │
└───────────────────────────────────┬─────────────────────────────┘↓
┌─────────────────────────────────────────────────────────────────┐
│                2. 实现基础属性(对外暴露信息)                    │
│  ┌────────────────────────┐  ┌────────────────────────┐         │
│  │  public int Capacity   │  │  public int Count      │         │
│  │  (获取数组容量)      │  │  (获取元素总数)      │         │
│  │  get { return data.Length; }  get { return count; }  │         │
│  └────────────────────────┘  └────────────────────────┘         │
└───────────────────────────────────┬─────────────────────────────┘↓
┌─────────────────────────────────────────────────────────────────┐
│                3. 实现核心功能方法                                │
├───────────────┬───────────────┬───────────────┬───────────────┐   │
│   Add(T item) │ Insert(...)   │ RemoveAt(...) │  IndexOf(...) │   │
│  (添加元素) │ (插入元素)  │ (删除元素)  │ (查找索引)  │   │
├───────────────┼───────────────┼───────────────┼───────────────┤   │
│  LastIndexOf(...)  │   Sort()    │  索引器 [...]  │  KR()扩容   │   │
│  (反向查索引)    │ (排序)    │ (元素访问)  │ (内部用)  │   │
└───────────────┴───────────────┴───────────────┴───────────────┘   │
└───────────────────────────────────┬─────────────────────────────┘↓
┌─────────────────────────────────────────────────────────────────┐
│                4. 支持高级特性(遍历与初始化)                    │
│  ┌─────────────────────────────────┐  ┌─────────────────────┐   │
│  │  实现 IEnumerable<T> 接口        │  │  添加构造函数       │   │
│  │  - GetEnumerator()              │  │  - 接收 IEnumerable │   │
│  │  - 用 yield return 遍历元素      │  │  - 批量添加元素     │   │
│  └─────────────────────────────────┘  └─────────────────────┘   │
└───────────────────────────────────┬─────────────────────────────┘↓
┌─────────────────────────────────────────────────────────────────┐
│                5. 测试验证                                      │
│  - 集合初始化器:new MyList<int> {1,2,3}                       │
│  - foreach 遍历元素                                             │
│  - 增/删/查/改/排序功能验证                                      │
└───────────────────────────────────┬─────────────────────────────┘↓
┌─────────────────────────────────────────────────────────────────┐
│                    结束:功能完成                                │
└─────────────────────────────────────────────────────────────────┘

首先定义一个 MyList<> 泛型类

 internal class MyList<T> : IEnumerable<T>{private T[] data = new T[0];private int count = 0;//数据个数public int Capacity //获取或设置列表的容量{get { return data.Length; }}public void Add(T item){KR();data[count] = item;count++;}//添加数据public int Count //Count数据个数,不能set设置count值,放止外界修改{get{return count;}}// 集合初始化器构造函数public MyList(IEnumerable<T> collection)//collection代表集合 {}{foreach (var item in collection){Add(item);}}// 无参构造函数public MyList() { }#region 插入数据的方法 Insertpublic void Insert(int index, T item){if (index < 0 || index > count - 1){throw new IndexOutOfRangeException("索引参数超出范围了");}KR();for (int i = count - 1; i > index - 1; i--){data[i + 1] = data[i];}data[index] = item;count++;}#endregion#region 扩容private void KR(){if (data.Length == 0){data = new T[4];}//添加元素前,判断数组是否满if (data.Length == count){T[] temp = new T[count * 2];for (int i = 0; i < data.Length; i++){temp[i] = data[i];}data = temp;}}#endregion#region 索引器 [index]//dx通过索引器访问方法public T this[int index]{get{if (index < 0 || index > count - 1){throw new IndexOutOfRangeException("索引参数超出范围了");}return data[index];}set{data[index] = value;}}#endregion #region 整数类型排序 Sortpublic void Sort(){bool isChange ;//标记排序是否完成int num = 0; //记录交换次数for (int i = 0; i < count - 1; i++){isChange = false; // 每次外层循环开始时重置为falsefor (int j = 0; j < count - 1-i; j++){if ((dynamic)data[j] > (dynamic)data[j + 1]){T temp = data[j];data[j] = data[j + 1];data[j + 1] = temp;isChange = true;num++;}}if (isChange == false){ break; }}Console.WriteLine($"交换了:{num}次");}#endregion#region 索引删除数据 RemoveAtpublic void RemoveAt(int index){if (index < 0 || index > count - 1){throw new IndexOutOfRangeException("索引参数超出范围了");}for (int i = index; i < count-1; i++){data[i] = data[i + 1];            }count--;}#endregion#region 取得第一个对应元素所在列表中的索引位置 IndexOfpublic int IndexOf(T item){int index=-1;//定义一个索引值for (int i = 0; i < count; i++){if (item.Equals(data[i])){index=i;break;}}if (index == -1){Console.WriteLine("没有要查找的数据");}return index;}#endregion#region 取得最后一个对应元素所在列表中的索引位置 LastIndexOfpublic int LastIndexOf(T item){int index = -1;//定义一个索引值for (int i = count-1; i >= 0; i--){if (item.Equals(data[i])){index = i; break;}}if (index == -1){Console.WriteLine("没有要查找的数据");}return index;}#endregion#region 实现IEnumerable<T>接口,支持foreach遍历public IEnumerator<T> GetEnumerator(){for (int i = 0; i < count; i++){yield return data[i];}}IEnumerator IEnumerable.GetEnumerator(){return GetEnumerator();}#endregion}

主函数测试

  static void Main(string[] args){MyList <int> list= new MyList<int>() { 1,5,6,88};list.Add(1);list.Add(5);list.Add(3);list.Add(4);list.Add(9);list.Add(6);list.Insert(0, 9);//在索引为0的位置添加一个数据Console.WriteLine("取得第一个对应元素所在列表中的索引位置"+list.IndexOf(9));Console.WriteLine("取得最后一个对应元素所在列表中的索引位置" + list.LastIndexOf(9));//删除索引位置在1的数据list.RemoveAt(1);//从小到大排序list.Sort ();Console.Write("列表数据包含:");foreach (int item in list){Console.Write(item + " ");}Console.WriteLine("元素个数:" + list.Count);}

注:IEnumerable<T>

IEnumerable<T> 是 C# 中定义在 System.Collections.Generic 命名空间下的泛型接口,用于表示一个可枚举的集合。它是 .NET 集合框架中非常基础且重要的接口,所有支持 foreach 循环遍历 的集合都实现了这个接口(或其非泛型版本 IEnumerable)。

核心作用

  • 提供 统一的遍历方式:无论集合内部结构如何(数组、链表、哈希表等),只要实现了 IEnumerable<T>,就能通过 foreach 循环遍历元素。
  • 支持 延迟执行:配合 LINQ 时,可以实现查询的延迟执行(只在真正需要结果时才计算),提高性能。

接口定义

IEnumerable<T> 接口非常简单,只包含一个方法:

public interface IEnumerable<out T> : IEnumerable
{// 返回一个用于遍历集合的枚举器IEnumerator<T> GetEnumerator();
}

其中:

  • IEnumerator<T> 是另一个接口,负责实际遍历逻辑,包含 MoveNext()(移动到下一个元素)、Current(获取当前元素)等成员。
  • foreach 循环的本质就是调用 GetEnumerator() 获取枚举器,然后通过枚举器遍历元素。

例如,在 本代码中添加以下实现:

using System.Collections;
using System.Collections.Generic;public class MyList<T> : IEnumerable<T>
{// 其他现有代码...// 实现 IEnumerable<T> 接口public IEnumerator<T> GetEnumerator(){for (int i = 0; i < count; i++){yield return data[i]; // 逐个返回元素,支持 foreach 遍历}}// 非泛型版本的实现(接口继承要求)IEnumerator IEnumerable.GetEnumerator(){return GetEnumerator();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91331.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91331.shtml

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

相关文章

记录Linux下ping外网失败的问题

最近在RK3568上进行开发测试&#xff0c;需要测试一下网络环境&#xff0c;能否通过浏览器访问外部网络。测试情况如下&#xff1a; 1、ping内网、网关ip能ping通 2、ping外网ping不通 情况分析&#xff1a; 1、ping外网失败&#xff08;ping 8.8.8.8也ping不通&#xff0c;说…

Redis 键值对操作详解:Python 实现指南

一、环境准备 1. 安装依赖库 pip install redis2. 连接 Redis 数据库 import redis# 创建 Redis 客户端连接 r redis.Redis(hostlocalhost, # Redis 服务器地址port6379, # Redis 端口db0, # 数据库编号&#xff08;0~15&#xff09;passwordNone, …

制造业企业大文件传输的痛点有哪些?

在全球化与数字化的浪潮下&#xff0c;制造业企业的大文件传输需求日益凸显&#xff0c;然而诸多痛点也随之而来&#xff0c;严重制约着企业的高效运营与发展。复杂网络环境导致传输稳定性差制造业企业常涉及跨地域、跨国的业务合作与数据交流&#xff0c;网络环境复杂多变。在…

低速信号设计之 MDIO 篇

一、引言​ 在服务器的网络子系统中,MDIO(Management Data Input/Output)总线虽然传输速率相对较低,却扮演着极为关键的角色。它主要负责在 MAC(Media Access Control)层器件与 PHY(Physical Layer)层器件之间搭建起通信的桥梁,实现对 PHY 层器件的有效管理与状态监控…

AR技术赋能航空维修:精度与效率的飞跃

在航空工业领域&#xff0c;飞机维修与装配的精度要求越来越高。传统的维修方法依赖人工操作和经验判断&#xff0c;容易产生误差。随着增强现实&#xff08;AR www.teamhelper.cn &#xff09;技术的引入&#xff0c;航空维修迎来了革命性的变化。本文将探讨AR技术在航空维修中…

设计模式实战:自定义SpringIOC(理论分析)

自定义SpringIOC&#xff08;理论分析&#xff09; 上一篇&#xff1a;设计模式开源实战&#xff1a;观察者模式不知道怎么用&#xff1f;手撕Spring源码中跟着大佬学编程 上一篇我们研究了大佬在Spring源码中使用的观察者模式&#xff0c;今天我们再来聊聊Spring的核心功能—…

人工智能如何改变项目管理:应用、影响与趋势

人工智能如何改变项目管理&#xff1a;应用、影响与趋势1. 人工智能如何提升项目规划与进度安排2. 人工智能在资源分配与优化中的应用3. 人工智能用于风险管理4. 人工智能用于团队协作与交流5. 人工智能用于项目监控与报告6. 集成人工智能的项目管理软件6.1 Wrike6.2 ClickUp6.…

【MySql】事务的原理

​ 【MySql】事务的原理数据库的隔离级别原理读未提交读已提交可重复读&#xff08;Repeatable Read&#xff09;串行化&#xff08;最高的隔离级别&#xff0c;强制事务串行执行&#xff0c;避免了所有并发问题&#xff09;MVCC&#xff08;Multi-Version Concurrency Control…

YOLO--目标检测基础

一、基本认知1.1目标检测的定义目标检测&#xff08;Object Detection&#xff09;&#xff1a;在图像或视频中检测出目标图像的位置&#xff0c;并进行分类和识别的相关任务。主要是解决图像是什么&#xff0c;在哪里的两个具体问题。1.2使用场景目标检测的使用场景众多&#…

GitLab 18.2 发布几十项与 DevSecOps 有关的功能,可升级体验【四】

沿袭我们的月度发布传统&#xff0c;极狐GitLab 发布了 18.2 版本&#xff0c;该版本带来了议题和任务的自定义工作流状态、新的合并请求主页、新的群组概览合规仪表盘、下载安全报告的 PDF 导出文件、中心化的安全策略管理&#xff08;Beta&#xff09;等几十个重点功能的改进…

Python----大模型(大模型微调--BitFit、Prompt Tuning、P-tuning、Prefix-tuning、LORA)

一、大模型微调 1.1、解释 微调(Fine-tuning)是在预训练大模型基础上&#xff0c;针对特定领域数据进行二次训练的技术过程。这一过程使大型语言模型(如GPT、BERT等)能够更好地适应具体应用场景&#xff0c;显著提升在专业领域的表现。 1.2、微调的基本流程 模型选择&#xf…

本地安装 SQLite 的详细步骤

方法 1:使用预编译二进制文件 下载 SQLite: 访问 SQLite 官方下载页面。 下载 Precompiled Binaries for Windows 中的 sqlite-tools-win32-x86-*.zip。 解压文件: 将下载的 ZIP 文件解压到一个目录(例如 C:\sqlite)。 配置环境变量: 右键「此电脑」→「属性」→ 左侧「高…

专题:2025医药生物行业趋势与投融资研究报告|附90+份报告PDF、原数据表汇总下载

原文链接&#xff1a;https://tecdat.cn/?p43444 圈内人都知道&#xff0c;2024年的BioChina展会现场&#xff0c;某跨国药企高管盯着融资展板喃喃自语&#xff1a;“去年A轮平均3.2亿&#xff0c;今年怎么降到2.1亿了&#xff1f;” 这个细节&#xff0c;恰是行业寒冬的缩影…

Chroma安装教程

Chroma 这里讲述的是windows环境 下载Chroma安装包 下载地址&#xff1a;https://github.com/chroma-core/chroma/releases 运行 chroma-windows.exe run --port 8000通过心跳检测访问是否正常 http://localhost:8000/api/v2/heartbeat快速使用 python安装chromadb pyth…

kali Linux 2025.2安装教程(解决安装失败-图文教程超详细)

一&#xff0c;下载镜像&#xff1a; 进入官网&#xff1a;Get Kali | Kali Linux &#xff0c;往下滑 等待两年半&#xff0c;镜像下载好。 二&#xff0c;虚拟机安装&#xff1a; 转&#xff1a;VMware Workstation Pro 17 安装图文教程 知乎平台&#xff1a;VMware Work…

uniapp项目使用ucharts实现折线图详细讲解(案例)

1.在Hbuildx里面的工具>插件安装&#xff0c;进入DCloud搜索uchart 2.点击对应的项目导入该插件 可以看到在该目录下有该插件 3.进入官网演示 - uCharts跨平台图表库&#xff0c;找一个示例代码测试一下&#xff0c;是否可以成功应用 因为这里使用的是vue2&#xff0c;如果你…

数据分析师进阶——95页零售相关数据分析【附全文阅读】

这份资料适合零售行业从业者&#xff0c;尤其是服装销售领域的人员&#xff0c;能帮大家用数据分析提升销售业绩。资料先提出 “店铺 20 问”&#xff0c;引导思考店铺运营问题&#xff0c;接着点明数据分析对提升销售、找出销售不佳原因的重要性 。详细介绍销售业绩相关公式及…

计算机组成原理(6) - 加法器

加法器是数字电路中用于执行加法运算的基本逻辑单元&#xff0c;广泛应用于计算机、计算器、数字信号处理器等电子设备中。它能将两个二进制数相加&#xff0c;并输出结果及可能产生的进位。一、加法器的基本功能加法器的基本功能是在数字电路中对输入的二进制数执行加法运算&a…

Qt 与 WebService 交互开发

在现代软件开发中&#xff0c;WebService 已成为实现跨平台、跨语言通信的重要标准。Qt 作为一个强大的跨平台框架&#xff0c;提供了完善的工具和类库来实现与 WebService 的交互。本文将深入探讨 Qt 与 WebService 交互开发的核心技术和实践经验&#xff0c;包括 SOAP 协议实…

LLM 模型部署难题的技术突破:从轻量化到分布式推理的全栈解决方案

大语言模型(LLM)的部署一直是工业落地的核心挑战。动辄百亿甚至万亿参数的模型规模,对硬件资源、推理速度和系统稳定性提出了严苛要求。本文将系统剖析 LLM 部署中的关键技术瓶颈,从模型压缩、推理加速到分布式架构设计,提供可落地的工程化解决方案,并附具体实现代码。 …