C#的List和DIctionary实现原理(手搓泛型类以及增删查改等功能)

这里写自定义目录标题

      • List
      • DIctionary

List

MyList类:这是一个泛型类,能够存储任意类型的元素。
_items数组:用于实际存储元素。
_size变量:记录当前列表中的元素数量。
构造函数:初始化数组容量为 4。
Count属性:获取列表中的元素数量。
索引器this[int index]:用于访问列表中的元素。
Add方法:向列表中添加元素,若数组容量不足,会调用EnsureCapacity方法来扩容。
EnsureCapacity方法:确保数组容量足够,若不足则将数组容量扩大为原来的 2 倍。

using System;// 自定义列表类
public class MyList<T>
{private T[] _items;private int _size;// 构造函数,初始化数组容量public MyList(){_items = new T[4];_size = 0;}// 获取列表中的元素数量public int Count{get { return _size; }}// 索引器,用于访问列表中的元素public T this[int index]{get{if (index < 0 || index >= _size){throw new IndexOutOfRangeException();}return _items[index];}set{if (index < 0 || index >= _size){throw new IndexOutOfRangeException();}_items[index] = value;}}// 向列表中添加元素public void Add(T item){if (_size == _items.Length){EnsureCapacity(_size + 1);}_items[_size++] = item;}// 确保数组容量足够private void EnsureCapacity(int min){if (_items.Length < min){int newCapacity = _items.Length == 0 ? 4 : _items.Length * 2;if (newCapacity < min){newCapacity = min;}Array.Resize(ref _items, newCapacity);}}
}class Program
{static void Main(){// 创建自定义列表实例MyList<int> myList = new MyList<int>();// 添加元素myList.Add(1);myList.Add(2);myList.Add(3);// 访问元素for (int i = 0; i < myList.Count; i++){Console.WriteLine(myList[i]);}}
}    

DIctionary

MyDictionary<TKey, TValue>类:这是一个泛型类,可存储任意类型的键值对。
Entry结构体:用于存储单个键值对,包含键的哈希码、键和值。
_entries数组:实际存储键值对的数组。
_count变量:记录当前字典中的键值对数量。
构造函数:初始化数组容量为 InitialCapacity(这里设为 4)。
Count属性:获取字典中的键值对数量。
索引器this[TKey key]:用于根据键获取或设置值。
TryGetValue方法:尝试根据键获取值,如果找到则返回 true 并将值赋给输出参数 value,否则返回 false。
Add方法:向字典中添加键值对,如果键已存在则抛出异常。
Insert方法:插入键值对,会检查键是否已存在,若已存在且 add 参数为 true 则抛出异常,否则更新值。
EnsureCapacity方法:确保数组容量足够,若不足则将数组容量扩大为原来的 2 倍。

using System;// 自定义字典类
public class MyDictionary<TKey, TValue>
{private const int InitialCapacity = 4;private Entry[] _entries;private int _count;// 内部存储的键值对结构private struct Entry{public int HashCode;public TKey Key;public TValue Value;}// 构造函数,初始化数组容量public MyDictionary(){_entries = new Entry[InitialCapacity];_count = 0;}// 获取字典中的键值对数量public int Count{get { return _count; }}// 索引器,用于根据键获取或设置值public TValue this[TKey key]{get{if (TryGetValue(key, out TValue value)){return value;}throw new KeyNotFoundException();}set{Insert(key, value, false);}}// 尝试根据键获取值public bool TryGetValue(TKey key, out TValue value){for (int i = 0; i < _count; i++){if (Equals(_entries[i].Key, key)){value = _entries[i].Value;return true;}}value = default(TValue);return false;}// 添加键值对public void Add(TKey key, TValue value){Insert(key, value, true);}// 插入键值对private void Insert(TKey key, TValue value, bool add){if (_count == _entries.Length){EnsureCapacity(_count + 1);}int hashCode = key.GetHashCode();for (int i = 0; i < _count; i++){if (_entries[i].HashCode == hashCode && Equals(_entries[i].Key, key)){if (add){throw new ArgumentException("An item with the same key has already been added.");}_entries[i].Value = value;return;}}_entries[_count].HashCode = hashCode;_entries[_count].Key = key;_entries[_count].Value = value;_count++;}// 确保数组容量足够private void EnsureCapacity(int min){if (_entries.Length < min){int newCapacity = _entries.Length == 0 ? InitialCapacity : _entries.Length * 2;if (newCapacity < min){newCapacity = min;}Array.Resize(ref _entries, newCapacity);}}
}class Program
{static void Main(){// 创建自定义字典实例MyDictionary<string, int> myDictionary = new MyDictionary<string, int>();// 添加键值对myDictionary.Add("apple", 1);myDictionary.Add("banana", 2);myDictionary.Add("cherry", 3);// 根据键获取值int value;if (myDictionary.TryGetValue("banana", out value)){Console.WriteLine($"The value of 'banana' is: {value}");}// 使用索引器设置值myDictionary["apple"] = 5;Console.WriteLine($"The new value of 'apple' is: {myDictionary["apple"]}");}
}    

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

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

相关文章

尝试在软考66天前开始成为软件设计师-数据库系统

三级模式-两级映射 层次型架构设计 ---便利,应变能力↗ 外模式 (用户与数据库系统的接口 视图概念模式 (数据库中全体数据的逻辑结构和特征内模式 (数据物理结构和存储方式 外模式/模式映像。 该映像存在于外部级和概念级之间&#xff0c;实现了外模式到概念模式…

Hadoop•常用命令

听说这是目录哦 操作命令&#x1f96f;退出清屏切换工作目录移动文件查看创建删除复制文件内容查看编辑解压缩其它命令技巧 系统命令&#x1f355;vim操作命令(命令模式下)光标移动复制粘贴(vi编辑器内部)删除、撤销 若vi&#xff0c;vim&#xff0c;ls找不到命令⚠️能量站&am…

linux之 内存管理(1)-armv8 内核启动页表建立过程

一、内核启动时&#xff0c;页表映射有哪些&#xff1f; Linux初始化过程&#xff0c;会依次建立如下页表映射&#xff1a; 1.恒等映射&#xff1a;页表基地址idmap_pg_dir; 2.粗粒度内核镜像映射&#xff1a;页表基地址init_pg_dir; 3.fixmap映射&#xff1a;页表基地址为…

IntelliJ IDEA 快捷键系列:重命名快捷键详解

目录 引言一、默认重命名快捷键1. Windows 系统‌2. Mac 系统‌ 二、操作步骤与技巧1. 精准选择重命名范围‌2. 智能过滤无关内容‌ 三、总结 引言 在代码重构中&#xff0c;‌重命名变量、类、方法‌ 是最常用的操作之一。正确使用快捷键可以极大提升开发效率。本文针对 ‌Ma…

Swagger-告别手写文档

文章目录 1. 引言2. Swagger是什么&#xff1f;3. SpringBoot2.7.3集成Swagger4. 常见注解 1. 引言 在RESTful API开发中&#xff0c;维护准确、易读的接口文档是团队协作的核心挑战&#xff0c;通常接口文档分为离线的和实时的。离线的接口文档工具有 YAPI等&#xff0c;其中…

深入解析 C++ Vector:全面掌握 STL 核心容器的原理与高效实践

一、Vector 的核心概念与特性 Vector 是 C 标准库中最常用的动态数组容器&#xff0c;其底层基于连续内存存储元素&#xff0c;兼具数组的高效访问与动态扩容的灵活性。以下是其核心特性&#xff1a; 1.1 核心特性对比 特性普通数组Vector 容器内存分配静态固定动态增长访问效…

element-plus中DatePicker 日期选择器组件的使用

1.选择某一天 代码&#xff1a; <el-date-pickerv-model"invoice_date"type"date"placeholder"请选择日期"style"width: 200px;"clearable /> 运行效果&#xff1a; 问题所在&#xff1a;这个数据的格式不是我们后端需要的那种&…

Python Bug修复案例分析:Python 中常见的 IndentationError 错误 bug 的修复

在 Python 编程的世界里&#xff0c;代码的可读性和规范性至关重要。Python 通过强制使用缩进来表示代码块的层次结构&#xff0c;这一独特的设计理念使得代码更加清晰易读。然而&#xff0c;正是这种对缩进的严格要求&#xff0c;导致开发者在编写代码时&#xff0c;稍有不慎就…

Deal - DbC、检查Python 值、异常和副作用

文章目录 一、关于 Deal特点 二、安装三、30秒内使用 Deal四、其它贡献 一、关于 Deal Deal 是用于 design by contract (DbC) 和 检查值、异常和副作用的Python库。简而言之&#xff0c;交易使您能够编写bug的代码。 通过在代码中添加一些装饰器&#xff0c;您可以获得免费测…

Linux 一步部署DHCP服务

#!/bin/bash #脚本作者和日期 #author: PEI #date: 20250319 #检查root权限 if [ "$USER" ! "root" ]; then echo "错误&#xff1a;非root用户&#xff0c;权限不足&#xff01;" exit 0 fi #防火墙与高级权限 systemctl stop firewa…

MyBatis操纵数据库-XML实现(补充)

目录 一.多表查询二.MyBatis参数赋值(#{ }和${ })2.1 #{ }和${ }的使用2.2 #{ }和${ }的区别2.3 SQL注入2.3 ${ }的应用场景2.3.1 排序功能2.3.2 like查询 一.多表查询 多表查询的操作和单表查询基本相同&#xff0c;只需改变一下SQL语句&#xff0c;同时也要在实体类中创建出…

【Java篇】一气化三清:类的实例化与封装的智慧之道

文章目录 类和对象&#xff08;中&#xff09;五、对象的构造及初始化5.1 如何初始化对象5.2 构造方法5.2.1 构造方法的概念5.2.2 构造方法的特性 5.3 默认初始化5.4 就地初始化 六、封装6.1 封装的概念6.2 访问限定符6.3 封装扩展之包6.3.1 包的概念6.3.3导入包6.3.3全类名6.3…

深入解析 `SQL_SMALL_RESULT`:MySQL 的“小优化”大作用

深入解析 SQL_SMALL_RESULT&#xff1a;MySQL 的“小优化”大作用 在 MySQL 的查询优化工具箱中&#xff0c;SQL_SMALL_RESULT 是一个容易被忽略但可能带来小幅性能提升的关键字。它适用于特定场景&#xff0c;尤其是涉及 GROUP BY 或 DISTINCT 计算的小数据集查询。本文将深入…

python-leetcode 48.括号生成

题目&#xff1a; 数字n代表生成括号的对数&#xff0c;设计一个函数&#xff0c;用于生成所有可能并且有效的括号组合。 方法一&#xff1a;回溯 可以生成所有 2**2n 个 ‘(’ 和 ‘)’ 字符构成的序列&#xff0c;然后检查每一个是否有效即可 为了生成所有序列&#xff0c…

用css绘制收银键盘

最近需求说需要自己弄个收银键盘&#xff0c;于是乎直接上手搓 主要基于Vue3写的&#xff0c;主要是CSS <template><view class"container"><view class"info"><image class"img" src"" mode"">&l…

C# | 超简单CSV表格读写操作(轻松将数据保存到CSV,并支持读取还原)

C# | 超简单CSV表格读写操作&#xff08;轻松将数据保存到CSV&#xff0c;并支持读取还原&#xff09; 文章目录 C# | 超简单CSV表格读写操作&#xff08;轻松将数据保存到CSV&#xff0c;并支持读取还原&#xff09;一、上位机开发中的CSV应用背景二、CSV读写实战教学1. 基本对…

14:00面试,15:00就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到3月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

友思特应用 | 行业首创:基于深度学习视觉平台的AI驱动轮胎检测自动化

导读 全球领先的轮胎制造商 NEXEN TIRE 在其轮胎生产检测过程中使用了基于友思特伙伴Neurocle开发的AI深度学习视觉平台&#xff0c;实现缺陷检测率高达99.96%&#xff0c;是该行业首个使用AI平台技术推动缺陷检测自动化流程的企业。 将AI应用从轮胎开发扩展到制造过程 2024年…

09 python函数(上)

一、函数的介绍 什么是函数&#xff1f; 函数的诞生为了解决两个问题&#xff1a;可读性、重复性。使用函数可以将一些代码放在一起成为一个功能&#xff0c;方便调用&#xff0c;出现了函数也方便用户阅读代码。 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现…

Androidstudio出现警告warning:意外的元素

这些警告信息通常与 Android SDK 或系统镜像的配置文件有关&#xff0c;可能是由于 SDK 工具或系统镜像的版本不兼容或配置文件格式发生了变化。以下是解决这些警告的步骤&#xff1a; 1. 更新 Android SDK 工具 确保你使用的是最新版本的 Android SDK 工具&#xff1a; 打开…