当前位置: 首页 > article >正文

C# 集合(Collection)

文章目录

  • 前言
  • 一、动态数组(ArrayList)
  • 二、哈希表(Hashtable)
  • 三、排序列表(SortedList)
  • 四、堆栈(Stack)
  • 五、队列(Queue)
  • 六、点阵列(BitArray)


前言

  在 C# 编程领域,集合(Collection)类是不可或缺的重要组成部分,专为数据存储、检索与操作精心构建。它们提供了对栈、队列、列表及哈希表等经典数据结构的有力支持,多数集合类遵循相同接口规范,这既保障了使用方式的连贯性,又利于代码在不同集合类型间灵活切换与复用。集合类基于 Object 类(C# 所有数据类型的根基)构建对象集合,能容纳多样数据类型,还可按需动态调配内存、依索引便捷访问元素,以契合复杂多变的编程诉求。
在这里插入图片描述

一、动态数组(ArrayList)

  ArrayList 呈现为可单独索引的有序对象集,类似数组却更具弹性,能在运行时自动调整容量。与静态数组需预先定义固定大小不同,它允许在指定索引处自由增删元素,内部会高效重分配内存。常用于处理元素数量不定的数据场景,像动态收集用户输入、存储临时计算结果等。

示例代码

using System;
using System.Collections;

class Program
{
    static void Main()
    {
        ArrayList arrayList = new ArrayList();
        // 添加元素
        arrayList.Add(10);
        arrayList.Add("Hello");
        arrayList.Add(true);

        // 基于索引访问与修改元素
        int valueAtIndex1 = (int)arrayList[1];
        arrayList[2] = false;

        // 遍历 ArrayList
        foreach (var item in arrayList)
        {
            Console.WriteLine(item);
        }

        // 移除元素
        arrayList.Remove("Hello");
        Console.WriteLine("After removal:");
        foreach (var item in arrayList)
        {
            Console.WriteLine(item);
        }
    }
}

  上述代码先创建 ArrayList 实例,依次添加整型、字符串、布尔型数据,展示其异构存储能力;再按索引读取、修改元素;随后遍历输出所有元素,最后移除指定字符串元素并再次遍历展示动态调整效果,输出依次为 “10”“Hello”“True” 及 “10”“False”。

二、哈希表(Hashtable)

  Hashtable 借助键值对(Key/Value Pair)存储与检索数据,凭借哈希算法实现快速定位,键作为访问入口,对应唯一值。适用于需依据特定标识迅速查找对应内容的场景,如依据学号查学生档案、依商品条码取商品详情,在大数据量下优势尤为凸显。

示例代码

using System;
using System.Collections;

class Program
{
    static void Main()
    {
        Hashtable hashtable = new Hashtable();
        // 添加键值对
        hashtable.Add("Apple", 5);
        hashtable.Add("Banana", 8);
        hasht月table.Add("Cherry", 3);

        // 通过键获取值
        int appleQuantity = (int)hashtable["Apple"];
        Console.WriteLine($"Apple quantity: {appleQuantity}");

        // 遍历 Hashtable
        foreach (DictionaryEntry entry in hashtable)
        {
            Console.WriteLine($"{entry.Key}: {entry.Value}");
        }

        // 判断键是否存在并更新值
        if (hashtable.ContainsKey("Banana"))
        {
            hashtable["Banana"] = 10;
        }
        Console.WriteLine("After update:");
        foreach (DictionaryEntry entry in hashtable)
        {
            Console.WriteLine($"{entry.Key}: {entry.Value}");
        }
    }
}

  此代码构建 Hashtable 存储水果及数量,先添加三组键值对,依键 “Apple” 精准取值展示查找便捷性;再遍历输出所有键值信息;确认 “Banana” 键存在后更新对应值并二次遍历呈现更新成果,输出含各水果初始及更新后数量等信息。

三、排序列表(SortedList)

  SortedList 融合数组与哈希表之长,可借索引(如同数组)或键(类似哈希表)访问元素,且内部按键值自动排序,维持有序状态。在兼顾顺序性与快速查找需求场景下表现出色,如管理按姓氏笔画排序且可依姓名或序号检索的人员名单。

示例代码

using System;
using System.Collections;

class Program
{
    static void Main()
    {
        SortedList sortedList = new SortedList();
        // 添加键值对
        sortedList.Add("Zhang", 25);
        sortedList.Add("Li", 30);
        sortedList.Add("Wang", 28);

        // 通过索引访问
        int valueAtIndex1 = (int)sortedList[1];
        Console.WriteLine($"Value at index 1: {valueAtIndex1}");

        // 通过键访问
        int wangAge = (int)sortedList["Wang"];
        Console.WriteLine($"Wang's age: {wangAge}");

        // 遍历 SortedList
        foreach (DictionaryEntry entry in sortedList)
        {
            Console.WriteLine($"{entry.Key}: {entry.Value}");
        }
    }
}

  代码创建 SortedList 存人员姓名及年龄,添加数据后,既按索引获取第二元素对应年龄展示数组特性,又依 “Wang” 键查年龄凸显哈希表功能;最终遍历输出有序键值对,展示排序与双访问模式结合优势。

四、堆栈(Stack)

  Stack 遵循后进先出(LIFO)原则,新元素 “推入(Push)” 栈顶,移除时 “弹出(Pop)” 栈顶元素,常用于处理需逆序回溯或操作顺序敏感事务,像解析嵌套括号表达式、实现撤销重做功能,保障操作按正确逆序执行。

示例代码

using System;
using System.Collections;

class Program
{
    static void Main()
    {
        Stack stack = new Stack();
        // 推入元素
        stack.Push(1);
        stack.Push(2);
        stack.Push(3);

        // 弹出元素并输出
        int poppedValue = (int)stack.Pop();
        Console.WriteLine($"Popped value: {poppedValue}");

        // 遍历 Stack(需转换为数组辅助)
        object[] stackArray = stack.ToArray();
        for (int i = stackArray.Length - 1; i >= 0; i--)
        {
            Console.WriteLine(stackArray[i]);
        }
    }
}

  此例先向 Stack 依次推入 1、2、3 三个元素,弹出栈顶 “3” 并输出;后将 Stack 转数组逆序遍历,展示 LIFO 特性,输出先是 “3”,再依次为 “2”“1”。

五、队列(Queue)

  Queue 依先进先出(FIFO)规则运作,元素 “入队(Enqueue)” 队尾,“出队(Dequeue)” 于队首,精准模拟现实排队场景,广泛用于任务调度、消息传递等需按先来后到处理事务之处,如计算机多任务排队等待 CPU 执行。

示例代码

using System;
using System.Collections;

class Program
{
    static void Main()
    {
        Queue queue = new Queue();
        // 入队元素
        queue.Enqueue("Task 1");
        queue.Enqueue("Task 2");
        queue.Enqueue("Task 3");

        // 出队元素并输出
        string dequeuedTask = (string)queue.Dequeue();
        Console.WriteLine($"Dequeued task: {dequeuedTask}");

        // 遍历 Queue(需转换为数组辅助)
        object[] queueArray = queue.ToArray();
        foreach (var item in queueArray)
        {
            Console.WriteLine(item);
        }
    }
}

  代码构建 Queue 模拟任务队列,“Task 1”“Task 2”“Task 3” 依次入队,出队首 “Task 1” 并输出;转数组遍历展示剩余任务,输出依次是 “Task 1”“Task 2”“Task 3”(出队后剩 “Task 2”“Task 3” 及遍历展示顺序)。

六、点阵列(BitArray)

  BitArray 是二进制数组,用 0 和 1 存数据,适合处理位级信息,尤其在事先不知所需存储位数时大显身手,常见于网络通信、图像数据处理、底层系统状态标识等,以紧凑方式管理二进制数据。

示例代码

using System;
using System.Collections;

class Program
{
    static void Main()
    {
        BitArray bitArray = new BitArray(5);
        // 设置位值
        bitArray[0] = true;
        bitArray[2] = true;

        // 检查位值
        bool bitValueAt1 = bitArray[1];
        Console.WriteLine($"Bit value at index 1: {bitValueAt1}");

        // 遍历 BitArray
        for (int i = 0; i < bitArray.Length; i++)
        {
            Console.WriteLine($"Bit value at index {i}: {bitArray[i]}");
        }
    }
}

  本示例创建长度为 5 的 BitArray,设置第 1、3 位(索引 0、2)为 “true”(即值 1),检查索引 1 位值并遍历输出各点位值,展示二进制位存储、访问与遍历操作,输出含各点位设置及初始值情况。
在这里插入图片描述


http://www.kler.cn/a/415431.html

相关文章:

  • 网络原理(一)—— http
  • Nginx篇之实现nginx转发兼容HTTP和Websocket两种协议
  • FFmpeg 简介与编译
  • 自带DC-DC单片机32位MM32SPIN080G
  • 深入探索Flax:一个用于构建神经网络的灵活和高效库
  • 【阅读记录-章节4】Build a Large Language Model (From Scratch)
  • 从Facebook的技术演进看社交媒体的未来趋势
  • 【微服务】http客户端Feign
  • Redis中的分布式锁(步步为营)
  • MySQL单行函数
  • uniapp在App端引用echarts组件,解决无法渲染formatter问题
  • 阿里滑块v2,1.1.11新版,后面考虑上AI轨迹
  • 速发论文 | 基于 2D-SWinTransformer+1D-CNN-SENet并行故障诊断模型
  • 【C++】泛型算法(五):泛型算法结构与特定容器算法
  • RuoYi排序
  • 数学建模选MATLAB还是Python?
  • webpack5减少构建文件体积(五)
  • CSS新特性(11)
  • ⭐ Unity 资源管理解决方案:Addressable_ Demo演示
  • 从ChatGPT到代理AI:安全领域的新变革
  • Vue CLI 提供了哪些功能
  • 【Ubuntu】安装 Anaconda
  • 注册表修改键盘位置
  • 专业130+总分400+西南交通大学824信号与系统考研经验西南交大电子信息与通信工程,真题,大纲,参考书。
  • 小程序 - 个人简历
  • 添加字符(暴力模拟)