C#学习笔记——泛型、字典 📅 发布时间:2026/7/8 23:06:41 👁️ 浏览次数: 1.泛型1.ArrayList 与 ListT的不同点特性ArrayList (System.Collections)ListT (System.Collections.Generic)类型安全非泛型存储 object 类型泛型编译时类型检查性能需要装箱/拆箱操作性能较低无需装箱/拆箱性能更高内存使用可能更多存储 object 引用更高效直接存储值类型引入版本.NET 1.0.NET 2.0 (引入泛型后)排序/查找需要自定义比较器支持类型特定的比较线程安全非线程安全非线程安全推荐使用场景遗留代码需要混合类型存储现代代码类型明确的集合ArrayList: 本质是一个 object[] 数组。存取值类型如 int时需要进行装箱和拆箱不仅消耗性能还容易在转换时抛出异常。ListT: 也就是泛型列表编译器会为具体类型生成专用代码。它是 C# 开发的首选。2.ListTA. 创建ListListint numbers new Listint(); // 空列表 Liststring names new Liststring() { Alice, Bob, Charlie }; // 初始化列表 Listdouble values new Listdouble(10); // 指定初始容量ListT 提供了比数组更丰富的方法且底层自动处理扩容通常由 0 - 4 - 8 - 16 倍增。B. 增删改查Liststring names new Liststring { 张三, 李四 }; // 添加 names.Add(王五); // 单个 names.AddRange(new[] { A, B }); // 批量 // 插入 names.Insert(1, 赵六); // 在索引1插入 // 删除 names.Remove(李四); // 按值删 names.RemoveAt(0); // 按索引删 names.RemoveAll(n n.Length 5); // 按条件删 (Lambda) // 查找 bool exists names.Contains(张三); string found names.Find(n n.StartsWith(A)); // 返回第一个匹配项 Liststring allFound names.FindAll(n n.Length 1); // 返回所有匹配项C. 常用方法int count numbers.Count; // 获取元素数量 bool contains numbers.Contains(3); // 检查是否包含 int index numbers.IndexOf(3); // 查找索引 numbers.Insert(1, 5); // 在指定位置插入 numbers.Remove(3); // 移除指定元素 numbers.RemoveAt(0); // 移除指定位置的元素 numbers.Clear(); // 清空列表D. 排序 (Sort)ListT.Sort 非常强大支持多种排序方式1. 默认排序: 元素需实现 IComparableT。2. 自定义比较器: 实现 IComparerT 接口。students.Sort((x, y) { // 返回值含义0 (x在前), 0 (相等), 0 (y在前) return y.Age - x.Age;E. 遍历// foreach 循环 foreach (int num in numbers) { Console.WriteLine(num); } // for 循环 for (int i 0; i numbers.Count; i) { Console.WriteLine(numbers[i]); }F. 类型转换ListT 提供了方便的转换方法1. ToArray(): 转为数组。2. ConvertAllTOutput: 将 List 转换为另一种类型的 List。例题:需求如下:定义一个产品Product类定义产品name名称价格Price字段并用属性进行封装定义一个产品集合用来存放5个产品。通过循环的方式用Console.ReaderLine()接受5个产品的信息。通过循环打印集合中所有产品的信息。 产品名称XXX 价格YYYY计算集合中所有产品的总金额和平均价格打印集合中价格低于10的商品信息将集合中价格超过100的商品从集合中删除internal class Program { static void Main(string[] args) { ListProduct products new ListProduct(); for (int i 0; i 5; i) { Console.WriteLine($请输入第{i 1}个商品的信息); Console.Write(请输入商品名字); string name Console.ReadLine(); double price; while (true) { Console.Write(请输入商品价格); if (double.TryParse(Console.ReadLine(), out price) price0) { break; } Console.WriteLine(请输入正整数); } Product pro new Product(name, price); products.Add(pro); } Console.WriteLine(商品信息); foreach (var pro in products) { Console.WriteLine($产品名称{pro.Name}\t价格{pro.Price}); } double totalAmount 0; foreach (var pro in products) { totalAmount pro.Price; } double avgPrice totalAmount / products.Count; Console.WriteLine($总金额{totalAmount}); Console.WriteLine($平均价格{avgPrice}); Console.WriteLine( 价格低于10的商品 ); ListProduct lowPriceProducts products.FindAll(pro pro.Price 10); foreach (var pro in lowPriceProducts) { Console.WriteLine($产品名称{pro.Name}\t价格{pro.Price}); } Console.WriteLine( 删除价格超过100的商品 ); int removedCount products.RemoveAll(pro pro.Price 100); foreach (var pro in products) { Console.WriteLine($产品名称{pro.Name} 价格{pro.Price}); } } }internal class Product { private string _name; private double _price; public string Name { get _name; set _name value; } public double Price { get _price; set _price value; } public Product(string name,double price) { _name name; _price price; } }2.字典1.Hashtable与DictionaryK,V的区别特性HashtableDictionaryTKey, TValue类型安全❌ 非泛型✔️ 泛型线程安全✔️ 是但性能低❌ 否但性能高性能较慢装箱拆箱更快无装箱拆箱空值支持Key 不能为null取决于TKey/TValue迭代顺序不保证.NET Core 保留插入顺序推荐使用已过时不推荐新代码使用现代代码首选Hashtable:1. Key 和 Value 都是 object。2. 底层: 使用开放寻址法处理哈希冲突。3. 遍历: 无序插入顺序与遍历顺序无关。4. 线程安全: 提供 Synchronized 包装器但效率低。DictionaryK,V:1. Key 和 Value 是强类型。2. 底层: 使用拉链法处理哈希冲突Bucket数组 Entry链表。3. 性能: 查找时间复杂度接近 O(1)。4.遍历: .NET Core 以后版本保留了插入顺序。2.DictionaryK,V概念DictionaryK, V是.NET框架中的泛型集合类属于System.Collections.Generic命名空间。它以键值对的形式存储数据每个键必须唯一但值可以重复。特征:类型安全通过泛型避免装箱拆箱操作高效查找基于哈希表实现平均O(1)时间复杂度动态扩容容量不足时自动扩展键唯一性确保每个键在字典中只出现一次A. 创建DictionaryK,V// 基本声明与实例化 Dictionarystring, int dict1 new Dictionarystring, int(); // 集合初始化器 (C# 3.0) Dictionarystring, int dict2 new Dictionarystring, int { { 张三, 18 }, { 李四, 23 } }; // 索引器初始化 (C# 6.0) Dictionarystring, int dict3 new Dictionarystring, int { [张三] 18, [李四] 23 }; // 指定初始容量优化性能 Dictionarystring, int dict4 new Dictionarystring, int(100);B. 添加与访问Dictionarystring, int scores new Dictionarystring, int(); // 添加 (Add方法如果键已存在会抛异常) scores.Add(张三, 90); // 索引器 (推荐如果键不存在则添加存在则修改) scores[李四] 85; scores[李四] 88; // 修改 李四 的分数为 88 // 安全查找 (TryGetValue - 最常用模式) if (scores.TryGetValue(张三, out int score)) { Console.WriteLine($张三的成绩是: {score}); } else { Console.WriteLine(没有找到Key); }C. 修改与删除// 修改值 scores[张三] 78; // 删除指定键 bool removed scores.Remove(李四); // 删除并获取值 需要在.Net Core中使用 if (scores.Remove(张三, out int zhangsan)) { Console.WriteLine($已删除Charlie年龄: {zhangsan}); } // 清空字典 scores.Clear();D. 遍历注意在 foreach 遍历过程中绝对不能修改字典添加或删除元素否则会抛出异常。// 遍历键值对 foreach (KeyValuePairstring, int kvp in scores) { Console.WriteLine(${kvp.Key}: {kvp.Value}); } // 简化写法 foreach (var kvp in scores) { Console.WriteLine(${kvp.Key}: {kvp.Value}); } // 只遍历键 foreach (string name in scores.Keys) { Console.WriteLine(name); } // 只遍历值 foreach (int a in scores.Values) { Console.WriteLine(a); }例题:创建Directory集合存放学员姓名和年龄向字典中手动添加多个学员信息在控制台上接受学员姓名从集合中查找学员对应年龄并打印再根据学员姓名从集合中删除学员信息打印剩下的所有学员姓名和年龄internal class Program { static void Main(string[] args) { Dictionarystring, int student new Dictionarystring, int(); student.Add(张三, 18); student.Add(李四, 23); student.Add(王五, 17); student.Add(赵六, 26); Console.WriteLine(请输入学员姓名); string name Console.ReadLine(); if (student.ContainsKey(name)) { Console.WriteLine(${name}的年龄是{student[name]}); } else { Console.WriteLine(未找到相关学员); } Console.WriteLine(选择要删除的学员信息名称); string deletename Console.ReadLine(); if (student.ContainsKey(deletename)) { student.Remove(deletename); } else { Console.WriteLine(未找到相关学员); } Console.WriteLine(学生信息展示); foreach (KeyValuePairstring, int kvp in student) { Console.WriteLine($姓名{kvp.Key}年龄{kvp.Value}); } } }3. 学习总结1. 首选泛型:优先使用 ListT 和 DictionaryK,V。只有在维护极老的 .NET Framework 1.x 代码时才考虑 ArrayList 或 Hashtable。2.安全读写:使用 TryGetValue 来获取字典值避免异常。使用 ContainsKey 在添加前检查如果使用 Add。3. 性能优化:创建集合时若能预估数量请在构造函数中指定数量。自定义对象作为 Dictionary 的 Key 时必须正确重写 GetHashCode() 和 Equals() 方法。4.遍历修改:如果需要一边遍历一边删除元素请先使用 .ToList() 复制一份 Key 列表或者使用 for 倒序循环针对 List。
深度学习在电能质量扰动识别中的应用:从原理到实战 摘要 电能质量扰动识别是智能电网运维中的关键技术问题。随着分布式能源的大量接入和非线性负载的普及,电网中的电能质量问题日益突出。本文系统地介绍了基于深度学习(特别是1D-CNN和LSTM混合模型)的电能质量扰动识别方法,提供了完整的理论解释、算法设计、代码实现和实验… 2026/7/8 23:05:04
【Web攻防】SQLMap实战进阶:从数据猜解到高权限渗透的全流程指南 注:以下所有技术内容仅用于合法授权的安全测试与学习研究,未经授权对他人系统进行渗透测试均属违法行为,需严格遵守《网络安全法》等相关法律法规。 在Web安全渗透测试中,SQLMap是自动化SQL注入的核心工具,其强大之处不仅在于发现漏洞,更在于数据提取、权限提升、命令执行… 2026/7/4 15:07:57
第一章 计算机系统概述 第一章 计算机系统概述 1.2 计算机系统简介 1.2.1 计算机系统的概念和分类 计算机系统由“硬件”和“软件”两大部分组成。所谓“硬件”即指计算机的实体部份,它由看得见摸得着的各种电子元器件、各类光、电、机设备的实物组成,如主机、外设等等。所谓“… 2026/5/17 10:22:01
ROS Noetic + Gazebo 11 强化学习环境配置:3步解决TD3算法训练启动报错 ROS Noetic Gazebo 11 强化学习环境配置:3步解决TD3算法训练启动报错在机器人强化学习领域,ROS和Gazebo的组合堪称黄金搭档。但当你兴冲冲地下载了开源代码准备复现TD3算法时,迎接你的往往是各种莫名其妙的报错——Gazebo打不开、话题订阅失… 2026/7/8 23:06:38
DAGM 2007 纹理缺陷数据集:弱监督检测的 3 种主流方法对比 DAGM 2007纹理缺陷数据集:弱监督检测的3种主流方法深度实践在工业质检领域,纹理背景上的微小缺陷检测一直是个棘手问题。当只能获得图像级标签(如椭圆形标注框)而非精确的像素级标注时,传统监督学习方法往往捉襟见肘。… 2026/7/8 23:06:38
中医AI助手终极指南:5分钟免费搭建你的智能中医诊疗系统 中医AI助手终极指南:5分钟免费搭建你的智能中医诊疗系统 【免费下载链接】CMLM-ZhongJing 首个中医大语言模型——“仲景”。受古代中医学巨匠张仲景深邃智慧启迪,专为传统中医领域打造的预训练大语言模型。 The first-ever Traditional Chinese Medicin… 2026/7/8 23:04:38
ResNet-18/34/50/101/152 架构对比:5种变体参数量与FLOPS实测分析 ResNet-18/34/50/101/152 架构深度对比:参数量、计算量与工程选型指南在计算机视觉领域,ResNet系列模型自2015年问世以来,始终保持着强大的生命力。本文将深入解析ResNet-18、34、50、101、152五种典型变体的架构差异,通过实测数据… 2026/7/8 23:04:38
FCM 模糊聚类 Python3 实战:3个UCI数据集对比,F1分数超0.95 FCM模糊聚类Python3实战:3个UCI数据集性能对比与优化策略引言:为什么选择FCM处理复杂数据集?在数据分析的实际场景中,我们常常遇到数据边界模糊、类别重叠的情况。想象一下医疗诊断中患者的症状表现,或是金融风控中客户… 2026/7/8 23:00:36
OpenCV 4.9.0 Canny边缘检测实战:5步实现医学影像血管分割(附Python代码) OpenCV 4.9.0 Canny边缘检测实战:5步实现医学影像血管分割(附Python代码)医学影像分析是计算机视觉在医疗领域的重要应用场景之一。血管分割作为其中的关键技术,能够帮助医生更清晰地观察血管网络结构,为疾病诊断和治疗… 2026/7/8 23:00:36
BetterNCM安装器:高效管理网易云插件的最佳选择 BetterNCM安装器:高效管理网易云插件的最佳选择 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件的繁琐安装流程而烦恼吗?BetterNCM安装器是… 2026/7/8 0:02:48
运动控制系统安全设置对比:ECI3808的3种限位保护与急停逻辑实现 运动控制系统安全机制深度解析:限位保护与急停逻辑的设计哲学在精密制造与自动化领域,运动控制系统的安全设计绝非简单的功能堆砌,而是一套融合了机械工程、电气原理和软件算法的防御体系。当一台数控机床以每分钟数万转的速度运转࿰… 2026/7/8 0:06:48
AI大模型应用开发:小白也能抓住的红利风口,收藏这篇入门指南! 文章指出,虽然微软等科技巨头在裁员,但英伟达等公司却在积极扩招AI相关人才,尤其是具身智能、仿真等领域。AI行业正在经历结构性调整,传统岗位被淘汰,而大模型应用开发等新岗位需求旺盛。对于想转行或学习AI的普通人来… 2026/7/8 0:10:49
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/8 20:15:17
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08