【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()); // 输出:30

Class2<double> doubleCalc = new Class2<double>(10.5, 20.6);
Console.WriteLine(doubleCalc.Add()); // 输出:31.1

Class2<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)

学习总结与进阶建议

核心知识图谱

复制代码

关键编程原则

  1. 泛型最佳实践​:

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

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

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

实战项目建议

  1. 泛型应用​:

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

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

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

编程箴言

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

相关推荐
星火开发设计12 分钟前
C++ 预处理指令:#include、#define 与条件编译
java·开发语言·c++·学习·算法·知识
BugShare31 分钟前
Obsidian 使用指南:从零开始搭建你的个人知识库
笔记·obsidian
BackCatK Chen1 小时前
第 1 篇:软件视角扫盲|TMC2240 软件核心特性 + 学习路径(附工具清单)
c语言·stm32·单片机·学习·电机驱动·保姆级教程·tmc2240
深蓝海拓1 小时前
PySide6从0开始学习的笔记(二十五) Qt窗口对象的生命周期和及时销毁
笔记·python·qt·学习·pyqt
理人综艺好会1 小时前
Web学习之用户认证
前端·学习
●VON1 小时前
React Native for OpenHarmony:项目目录结构与跨平台构建流程详解
javascript·学习·react native·react.js·架构·跨平台·von
跃渊Yuey1 小时前
【Linux】线程同步与互斥
linux·笔记
AI视觉网奇2 小时前
FBX AnimSequence] 动画长度13与导入帧率30 fps(子帧0.94)不兼容。动画必须与帧边界对齐。
笔记·学习·ue5
科技林总2 小时前
使用Miniconda安装Jupyter
笔记
woodykissme2 小时前
倒圆角问题解决思路分享
笔记·学习·工艺