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.pswp.cn/news/898759.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898759.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898759.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux系統管理與編程08:任務驅動綜合應用

蘭生幽谷&#xff0c;不為莫服而不芳&#xff1b; 君子行義&#xff0c;不為莫知而止休。 [環境] windows11、centos9.9.2207、zabbix6、MobaXterm、Internet環境 [要求] zabbix6.0安裝環境&#xff1a;Lamp&#xff08;linux httpd mysql8.0 php&#xff09; [步驟] 3 …

數據結構之基本隊列-順序結構實現-初始化-判斷隊列是否為空(front=rear)-出隊-入隊-隊尾滿了,調整隊列-獲取隊頭元素

數據結構之基本隊列-順序結構實現-初始化-判斷隊列是否為空(frontrear)-出隊-入隊-隊尾滿了&#xff0c;調整隊列-獲取隊頭元素——完整可運行代碼 #include <stdio.h>#define MAXSIZE 100 typedef int ElemType;typedef struct {ElemType data[MAXSIZE];int front;int…

基于LabVIEW的Windows平臺高速閉環控制

在Windows系統下&#xff0c;通過LabVIEW實現高速閉環控制面臨兩大核心挑戰&#xff1a;非實時操作系統的調度延遲與硬件接口的傳輸速度限制。以USB-6351&#xff08;NI USB-6351 DAQ卡&#xff09;為例&#xff0c;其理論采樣率可達1.25 MS/s&#xff08;單通道&#xff09;&a…

Java面試黃金寶典8

1. 什么是 Spring MVC 定義 Spring MVC 是 Spring 框架里用于構建 Web 應用程序的模塊&#xff0c;它嚴格遵循 MVC&#xff08;Model - View - Controller&#xff09;設計模式。這種設計模式把應用程序清晰地劃分成三個主要部分&#xff1a; Model&#xff08;模型&#xff0…

【 <二> 丹方改良:Spring 時代的 JavaWeb】之 Spring Boot 中的 RESTful API 設計:從上手到骨折

<前文回顧> 點擊此處查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、開篇整活…

分享最近前端面試遇到的一些問題

前情提要&#xff08;分享個人情況&#xff0c;可以直接跳過&#xff09; 先說一下我的個人情況&#xff0c;我是2026屆的&#xff0c;目前是在找前端實習。 3月初&#xff0c;從3月3日開始在Boss上投簡歷。 分享我的個人故事&#xff0c;不想看可以直接滑到下面&#xff0c;…

rip 協議詳細介紹

以下是關于 RIP&#xff08;Routing Information Protocol&#xff0c;路由信息協議&#xff09; 的詳細介紹&#xff0c;涵蓋其工作原理、版本演進、配置方法、優缺點及實際應用場景。 1. RIP 協議概述 類型&#xff1a;動態路由協議&#xff0c;基于距離矢量算法&#xff08…

scrapy入門(深入)

Scrapy框架簡介 Scrapy是:由Python語言開發的一個快速、高層次的屏幕抓取和web抓取框架&#xff0c;用于抓取web站點并從頁面中提取結構化的數據&#xff0c;只需要實現少量的代碼&#xff0c;就能夠快速的抓取。 新建項目 (scrapy startproject xxx)&#xff1a;新建一個新的…

KiLog2MaximumIncrement的由來和KiMaximumIncrementReciprocal的由來

第一部分&#xff1a;KiLog2MaximumIncrement的由來 i 1; j KeMaximumIncrement; while ((1UI64<<i) < KeMaximumIncrement) { i; } KiLog2MaximumIncrement i; 2^17131072 2^18262144 i18KiLog2MaximumIncrement 中…

數據結構-ArrayList

文章目錄 1. 線性表2. 順序表3. ArrayList4. ArrayList的問題以及思考4.2 增容的性能消耗問題4.3 空間浪費問題 1. 線性表 線性表&#xff08;Linear List&#xff09;是n個具有相同特性的數據元素的有限序列。線性表是一種在實際中廣泛使用的數據結構&#xff0c;常見線性表&…

FastGPT 社區版快速部署指南

產品簡介 FastGPT 是基于大語言模型的智能知識庫系統&#xff0c;提供以下核心能力&#xff1a; ? 開箱即用 - 內置數據預處理、多模型對接、權限管理 ? 可視化編排 - 通過 Flow 工作流實現復雜問答邏輯設計 ? 多場景適配 - 支持客服機器人/知識檢索/數據分析等場景 &…

【css酷炫效果】純CSS實現科技感網格背景

【css酷炫效果】純CSS實現科技感網格背景 緣創作背景html結構css樣式完整代碼基礎版進階版(3D光線掃描版) 效果圖 想直接拿走的老板&#xff0c;鏈接放在這里&#xff1a;上傳后更新 緣 創作隨緣&#xff0c;不定時更新。 創作背景 剛看到csdn出活動了&#xff0c;趕時間&a…

Android BLE 權限管理

前言 android 權限一直是比較活躍的 在藍牙權限這一塊又分新版和舊版 新版權限 android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.BLUETOOTH_ADVERTISE, android.Manifest.permission.BLUETOOTH_CONNECT舊版權限如9.0以下 Manifest.permission.A…

vue3:十一、主頁面布局(左側菜單折疊展開設置)

一、實現效果 二、基本實現 1、菜單容器增加展開收縮方法 在菜單容器中開啟這個方法&#xff0c;值設置為一個變量 :collapseiscollapse 2、定義菜單收縮與否的變量 在js中初始化是否收縮的變量&#xff0c;初始值為不收縮(也就是展開) //左側菜單展開與收縮 const iscolla…

Chapter 4-15. Troubleshooting Congestion in Fibre Channel Fabrics

show zone member: Shows the name of the zone to which a device belongs to. This command can be used to find the victims of a culprit device or vice versa. 顯示設備所屬的區域名稱。該命令可用于查找罪魁禍首設備的受害者,反之亦然。 show zone active: Shows the…

使用 JDBC 插入數據并獲取自動生成的主鍵(如 MySQL 的 AUTO_INCREMENT 或 Oracle 的序列) 的完整示例代碼,包含詳細注釋

以下是使用 JDBC 插入數據并獲取自動生成的主鍵&#xff08;如 MySQL 的 AUTO_INCREMENT 或 Oracle 的序列&#xff09; 的完整示例代碼&#xff0c;包含詳細注釋&#xff1a; import java.sql.*;public class GeneratedKeysExample {// 數據庫連接參數private static final St…

網絡爬蟲【爬蟲庫request】

我叫不三不四&#xff0c;很高興見到大家&#xff0c;歡迎一起學習交流和進步 今天來講一講爬蟲 Requests是Python的一個很實用的HTTP客戶端庫&#xff0c;完全滿足如今網絡爬蟲的需求。與Urllib對比&#xff0c;Requests不僅具備Urllib的全部功能&#xff1b;在開發使用上&…

MTKAndroid12 解決SystemUI下拉框中,長按WIFI圖標會導致崩潰問題

解決SystemUI下拉框中&#xff0c;長按WIFI圖標會導致崩潰問題 文章目錄 場景參考資料修改文件解決方案日志源碼分析 總結 場景 在部分產品中偶發性發現&#xff0c; SystemUI下拉框下拉后長按WIFI圖標會導致崩潰問題&#xff0c;有時候是截屏、點擊Home 按鍵后&#xff0c;長…

第三十一篇 數據倉庫(DW)與商業智能(BI)架構設計與實踐指南

目錄 一、DW/BI架構核心理論與選型策略1.1 主流架構模式對比&#xff08;1&#xff09;Kimball維度建模架構&#xff08;2&#xff09;Inmon企業工廠架構&#xff08;3&#xff09;混合架構 二、架構設計方法論與實施步驟2.1 維度建模實戰指南&#xff08;1&#xff09;模型選擇…

XSS基礎靶場練習

目錄 1. 準備靶場 2. PASS 1. Level 1&#xff1a;無過濾 源碼&#xff1a; 2. level2&#xff1a;轉HTML實體 htmlspecialchars簡介&#xff1a; 源碼 PASS 3. level3:轉HTML深入 源碼&#xff1a; PASS 4. level4:過濾<> 源碼&#xff1a; PASS: 5. level5:過濾on 源碼…