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 位值并遍历输出各点位值,展示二进制位存储、访问与遍历操作,输出含各点位设置及初始值情况。