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

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

编程箴言

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

相关推荐
ajassi200025 分钟前
开源 C# 快速开发(八)通讯--Tcp服务器端
开发语言·开源·c#
im_AMBER44 分钟前
数据结构 01 线性表
数据结构·学习
iconball1 小时前
个人用云计算学习笔记 --15. (Linux 系统启动原理、Linux 防火墙管理))
linux·运维·笔记·学习·云计算
聪明的笨猪猪1 小时前
Java SE “概念与优势”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
kikikidult2 小时前
ubuntu中卸载软件的几种方法
笔记·ubuntu
yi碗汤园2 小时前
【一文了解】C#的StringComparison枚举
开发语言·前端·c#
Larry_Yanan2 小时前
QML学习笔记(十九)QML的附加信号处理器
开发语言·笔记·qt·学习·ui
自小吃多2 小时前
光电探测-IV转换电路也称为TIA跨阻放大器-笔记
笔记·硬件工程
lingggggaaaa2 小时前
小迪安全v2023学习笔记(九十讲)—— 小程序篇&反编译&外在&主包分包&配置泄露&算法逆向&未授权
笔记·学习·安全·web安全·网络安全·小程序
huizhixue-IT2 小时前
每日信息分享,ITSS学习考试内容
学习