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

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

编程箴言

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

相关推荐
立志成为大牛的小牛2 分钟前
数据结构——二十三、并查集的终极优化(王道408)
开发语言·数据结构·笔记·学习·程序人生·考研
全栈游侠15 分钟前
04-优先级与延时链表
笔记
im_AMBER35 分钟前
React 01
前端·javascript·笔记·react.js·前端框架·web
稻草猫.1 小时前
文件 IO
java·笔记·后端·java-ee·idea
QT 小鲜肉1 小时前
【个人成长笔记】Qt Creator快捷键终极指南:从入门到精通
开发语言·c++·笔记·qt·学习·学习方法
future_studio2 小时前
聊聊 Unity(小白专享、C# 小程序 之 加密存储)
开发语言·小程序·c#
lkbhua莱克瓦242 小时前
Java基础——面向对象进阶复习知识点8
java·笔记·github·学习方法
c#上位机2 小时前
MefBootstrapper在Prism引导程序中的使用
c#·wpf·prism
QT 小鲜肉3 小时前
【数据结构与算法基础】05. 栈详解(C++ 实战)
开发语言·数据结构·c++·笔记·学习·算法·学习方法
A9better4 小时前
嵌入式开发学习日志40——stm32之I2C协议层
stm32·单片机·嵌入式硬件·学习