【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 | ArrayList | Dictionary<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) |
学习总结与进阶建议
核心知识图谱
关键编程原则
泛型最佳实践:
- 优先使用泛型集合
- 避免过度使用dynamic
- 约束泛型类型参数
集合使用准则:
- 预估容量减少扩容
- 使用foreach遍历
- 避免在循环中修改集合
字典优化技巧:
- 使用合适的数据类型作为键
- 实现自定义相等比较器
- 避免频繁的添加/删除操作
实战项目建议
泛型应用:
- 实现通用数据处理器
- 创建类型安全的对象池
- 开发泛型数学库
集合实战:
- 实现分页数据加载器
- 开发高性能数据缓存
- 创建动态配置系统
字典应用:
- 实现多语言资源管理器
- 开发配置参数系统
- 创建对象快速查找表
编程箴言
"泛型是类型安全的艺术,集合是数据管理的科学,字典是快速查找的魔法"