【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. 字典应用​:

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

编程箴言

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

相关推荐
lifallen2 分钟前
Avernet:Agent 的组织网络
人工智能·学习·ai·开源软件·ai编程
农村小镇哥7 分钟前
C#读取CSV文件的方法
服务器·数据库·c#
Q741_14717 分钟前
TcpDump 使用笔记
网络·c++·笔记·测试工具·tcpdump
疯狂打码的少年22 分钟前
【数据结构】队列的应用:循环队列
数据结构·笔记·算法
知识分享小能手43 分钟前
线性代数学习教程,从入门到精通,矩阵及其运算 — 完整知识点与详细推导(3)
学习·线性代数·矩阵
跳跃的芋头人1 小时前
RefactoringUI 阅读笔记1 - 从草稿开始
笔记
FuckPatience1 小时前
C# 报错参数无效
c#
是上好佳佳佳呀1 小时前
【深度学习|DAY03】神经网络深度学习笔记(上):框架总览、参数初始化与激活函数
笔记·深度学习·神经网络
小弥儿1 小时前
Firecrawl:把整个网页变成 AI 可查询的数据库
数据库·人工智能·学习
woshihuanglaoshi1 小时前
鸿蒙老旧项目升级改造高级:API废弃迁移/ArkTS语法升级/架构重构策略/增量迁移/风险管控方案
学习·华为·重构·架构·harmonyos·鸿蒙