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

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

编程箴言

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

相关推荐
hunteritself1 分钟前
DeepSeek 论文夺冠,智谱开源 GLM-4.5,OpenAI 学习模式上线!| AI Weekly 7.28-8.3
人工智能·学习·chatgpt·开源·bug·powerpoint
Dymc11 分钟前
【计算机视觉与代码大模型全景解析:从理论基础到学习路线】
人工智能·学习·计算机视觉
lingggggaaaa31 分钟前
小迪安全v2023学习笔记(五十讲)—— 持续更新中
笔记·学习·安全·web安全·网络安全
秋田君1 小时前
Vue3 + WebSocket网页接入弹窗客服功能的完整实现
前端·javascript·websocket·网络协议·学习
jxy pro max1 小时前
Corrosion2靶机练习笔记
服务器·网络·笔记
三千道应用题1 小时前
C#模式匹配用法与总结
c#
深海潜水员1 小时前
【Unity】背包系统 + 物品管理窗口 (上)
开发语言·vscode·游戏·unity·c#·游戏引擎
伽蓝_游戏1 小时前
Unity UI的未来之路:从UGUI到UI Toolkit的架构演进与特性剖析(6)
游戏·ui·unity·架构·c#·游戏引擎·.net
晨非辰1 小时前
#C语言——刷题攻略:牛客编程入门训练(一):简单输出、基本类型
c语言·学习·学习方法·visual studio
全是操作2 小时前
如何调试coze-studio
笔记·ai