当前位置: 首页 > news >正文

【C#学习Day14笔记】泛型、集合(数组列表Arraylist、列表list)与字典

前言

在C#第14天的学习中,我深入探索了泛型编程集合框架字典应用三大核心主题。这些概念是构建高效、灵活程序的关键工具。本文完整保留我的课堂实践代码和命名体系,通过结构化梳理帮助大家掌握这些核心知识。所有代码示例均来自我的实际操作,包含从基础到进阶的完整学习过程!


一、泛型编程:类型安全的代码复用

1. 泛型基础概念

// 创建泛型类
internal class Class2<T> // T代表类型参数
{public T a;public T b;public Class2(T a, T b){this.a = a;this.b = b;}public T Add(){// 使用dynamic实现泛型运算dynamic aVal = this.a;dynamic bVal = this.b;return aVal + bVal;}
}// 使用泛型类
Class2<int> intCalc = new Class2<int>(10, 20);
Console.WriteLine(intCalc.Add()); // 输出:30Class2<double> doubleCalc = new Class2<double>(10.5, 20.6);
Console.WriteLine(doubleCalc.Add()); // 输出:31.1Class2<string> strCalc = new Class2<string>("123", "456");
Console.WriteLine(strCalc.Add()); // 输出:"123456"

2. 泛型方法实现

// 泛型方法定义
public static void Add<T>(T a, T b)
{dynamic c = a;dynamic d = b;Console.WriteLine(c + d);
}// 使用泛型方法
Add(10, 20);        // 输出:30
Add(10.5, 20.6);    // 输出:31.1
Add<string>("张三", "123"); // 输出:"张三123"

3. 泛型核心优势

优势说明代码体现
类型安全编译时类型检查Class2<int>
代码复用一套代码处理多种类型Class2<T>
性能优化避免装箱拆箱操作直接操作值类型
灵活性适应不同数据类型需求Add<T>()

二、集合框架:动态数据容器

1. ArrayList:动态数组

// 创建ArrayList
ArrayList list1 = new ArrayList() { "张三", "李四", 12, 20, true, 'c' };// 基本操作
list1.Add(20);                  // 添加元素
list1.Insert(2, "小明");         // 插入元素
list1.Remove('c');              // 移除元素
list1.RemoveAt(0);              // 移除指定位置元素
list1.RemoveRange(0, 3);        // 移除范围元素// 查询操作
Console.WriteLine(list1.Contains("张三")); // 检查包含
Console.WriteLine(list1.IndexOf(20));     // 查找索引// 遍历ArrayList
foreach (var item in list1)
{Console.Write(item + " ");
}

2. List:类型安全的泛型列表

// 创建List<T>
List<int> intList = new List<int>() { 28, 65, 94, 7, 47, 13, 6, 9, 13, 59, 25 };// 基本操作
intList.Add(100);                // 添加元素
intList.Insert(0, 50);            // 插入元素
intList.Remove(13);              // 移除元素
intList.RemoveAt(0);              // 移除指定位置元素
intList.Sort();                  // 排序// 容量管理
intList.Capacity = 20;           // 设置初始容量
Console.WriteLine($"容量: {intList.Capacity}, 元素数: {intList.Count}");// 遍历List
foreach (int item in intList)
{Console.Write(item + " ");
}

3. 集合选择指南

集合类型使用场景性能特点
ArrayList存储混合类型数据需要装箱拆箱,性能较低
List存储同类型数据类型安全,高性能
数组固定大小集合最高性能,长度固定

三、字典应用:键值对数据存储

1. 字典基础操作

// 创建字典
Dictionary<string, int> personInfo = new Dictionary<string, int>()
{{"Name", 666},{"sex", 1},{"年龄", 18}
};// 基本操作
personInfo.Add("身高", 178);        // 添加元素
personInfo["Name"] = 888;          // 修改值
Console.WriteLine(personInfo["年龄"]); // 访问值// 查询操作
Console.WriteLine(personInfo.ContainsKey("Name")); // 检查键
Console.WriteLine(personInfo.ContainsValue(888));   // 检查值

2. 省份查询系统实战

// 准备省份数据
List<string> henan = new List<string> { "郑州市", "开封市", "洛阳市" };
List<string> hebei = new List<string> { "石家庄市", "唐山市", "秦皇岛市" };// 创建省份字典
Dictionary<string, List<string>> provinceDict = new Dictionary<string, List<string>>()
{{"河南省", henan},{"河北省", hebei}
};// 查询系统
while (true)
{Console.WriteLine("请输入要查询的省份:");string input = Console.ReadLine();if (provinceDict.ContainsKey(input)){Console.WriteLine($"{input}包含的城市:");foreach (string city in provinceDict[input]){Console.WriteLine($"- {city}");}break;}else{Console.WriteLine("输入省份不存在,请重新输入!");}
}

3. 字典遍历技巧

// 遍历键值对
foreach (KeyValuePair<string, List<string>> item in provinceDict)
{Console.WriteLine($"省份: {item.Key}");Console.WriteLine($"城市: {string.Join(", ", item.Value)}");
}// 仅遍历键
foreach (string province in provinceDict.Keys)
{Console.WriteLine(province);
}// 仅遍历值
foreach (List<string> cities in provinceDict.Values)
{Console.WriteLine(string.Join(", ", cities));
}

四、集合性能优化指南

1. 容量管理策略

List<int> optimizedList = new List<int>(100); // 预设容量// 添加大量数据时
for (int i = 0; i < 1000; i++)
{// 定期检查容量,避免频繁扩容if (optimizedList.Count == optimizedList.Capacity){optimizedList.Capacity *= 2; // 倍增策略}optimizedList.Add(i);
}

2. 集合选择决策树


3. 性能对比表

操作List​ArrayListDictionary<K,V>​
添加元素O(1) 摊销O(1) 摊销O(1) 摊销
插入元素O(n)O(n)不支持
删除元素O(n)O(n)O(1)
按索引访问O(1)O(1)不支持
按键访问不支持不支持O(1)
包含检查O(n)O(n)O(1)

学习总结与进阶建议

核心知识图谱


关键编程原则

  1. 泛型最佳实践​:

    • 优先使用泛型集合
    • 避免过度使用dynamic
    • 约束泛型类型参数
  2. 集合使用准则​:

    • 预估容量减少扩容
    • 使用foreach遍历
    • 避免在循环中修改集合
  3. 字典优化技巧​:

    • 使用合适的数据类型作为键
    • 实现自定义相等比较器
    • 避免频繁的添加/删除操作

实战项目建议

  1. 泛型应用​:

    • 实现通用数据处理器
    • 创建类型安全的对象池
    • 开发泛型数学库
  2. 集合实战​:

    • 实现分页数据加载器
    • 开发高性能数据缓存
    • 创建动态配置系统
  3. 字典应用​:

    • 实现多语言资源管理器
    • 开发配置参数系统
    • 创建对象快速查找表

编程箴言
"泛型是类型安全的艺术,集合是数据管理的科学,字典是快速查找的魔法"

http://www.lryc.cn/news/607017.html

相关文章:

  • 基于单片机汽车少儿安全预警系统
  • 118. 杨辉三角
  • 数据结构:在链表中查找(Searching in a Linked List)
  • [ java 网络 ] TPC与UDP协议
  • NTC热敏电阻的原理及应用
  • 8.1 开始新的学习历程
  • 应急响应(windows工具版)
  • Java文件读写I/O操作教程
  • Mysql group by
  • 【C++篇】C++11入门:踏入C++新世界的大门
  • 国内用户如何用手机进行YouTube直播?
  • 『React』 组件通信全攻略
  • 如何从头开始搭建属于自己的家用nas实现内网穿透访问
  • 提升文档管理:推荐一键Docker部署的全文索引搜索引擎工具
  • 如何将联系人从三星手机转移到 iPhone
  • RabbitMQ-镜像队列(Mirrored Queues)
  • 测试平台如何重塑CI/CD流程中的质量协作新范式
  • 什么是CI/CD?
  • 层次聚类:无需“猜”K值,如何让数据自己画出“家族图谱”?
  • HQChart实战教程58:K线主图仿TradingView实现
  • 日志归档存储策略在海外云服务器环境的容量规划方法
  • Bootstap Vue 之b-form-radio-group 不显示选中状态问题
  • Web学习:SQL注入之联合查询注入
  • 《协作画布的深层架构:React与TypeScript构建多人实时绘图应用的核心逻辑》
  • 《React Router深解:复杂路由场景下的性能优化与导航流畅性构建》
  • Positions, sizes, and layouts(位置、大小和布局)
  • 使用 whisper, 音频分割, 整理需求 2
  • 3D 建模核心术语扫盲:拓扑、UV 展开、烘焙与 AO 贴图解析
  • 2025年08月01日Github流行趋势
  • qt贝塞尔曲线演示工具