C#笔记进阶篇04 集合

这篇博客是关于C#中集合类的详细笔记,涵盖了ArrayList、HashTable、SortedList、Stack和Queue等,解释了它们的特点和常用操作,如动态数组的添加、删除、排序,哈希表的键值对操作,排序列表的排序规则,堆栈和队列的先进先出原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C#笔记进阶篇04 集合

——本系列是基于人民邮电出版社《C#2008 C#图解教程》、清华大学出版社《C#入门经典(第五版)》两本书的自学C#笔记,如果您发现了本文的纰漏,还望不吝指正。

写在前边

1).什么是数据结构

数据结构,直白地理解,就是研究数据的存储方式,描述数据之间的关系

2).数据结构大致包含以下几种存储结构:

线性:顺序表存储,需要提前申请一定大小的存储空间
链式:随用随申请,是非连续的内存空间,通过头尾地址联系在一起
树状:适合存储具有“一对多”关系的数据
图形:适合存储具有“多对多”关系的数据
散列:散列排布的,适合存储大量的数据

3) .什么是集合(Collections)

集合是C#写好的数据结构类库,除了数组Array外,还包括ArrayList,HashTable,Stack,Queue
引用System.Collections,就可以通过类名去实例化它的对象
大多数集合类实现了相同的接口

1. 动态数组(ArrayList)

动态数组(ArrayList)代表了可被单独索引的对象的有序集合。它基本上可以替代一个数组。但是,与数组不同的是,您可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。它也允许在列表中进行动态内存分配、增加、搜索、排序各项。——菜鸟教程 https://www.runoob.com/

1).声明:

ArrayList xxx = new ArrayList();

2).属性:

属性描述
Count获取ArrayList 中实际包含的元素个数
Capacity获取或设置 ArrayList 可以包含的元素个数
IsFixedSize获取一个值,表示 ArrayList 是否具有固定大小
IsReadOnly获取一个值,表示 ArrayList 是否只读
IsSynchronized获取一个值,表示访问 ArrayList 是否同步(线程安全)
Item[Int32]获取或设置指定索引处的元素
SyncRoot获取一个对象用于同步访问 ArrayList

3).方法:

添加 .Add(object value)把当前这个对象添加到数组中
删除 .Remove(object value)查询此元素,并移除第一个匹配的元素项
.RemoveAt(int index)根据下标号移除该元素
插入 .Insert(int index,Object value)把对应对象插入到对应的下标
访问/修改:通过索引器下标号
排序:.Sort();
反转:.Reverse();
检测是否包含: .Contains(object value)检测该集合是否包含该元素,如果包含返回true,不包含返回false
查找索引:.IndexOf(object value)找到第一个匹配该元素的下标号并返回下标号,如果没找到,则返回-1

4)访问:

//使用foreach遍历
foreach (int i in al)
{
	Console.Write(i + " ");
}

2. 哈希表(HashTable)

Hashtable类代表了一系列基于键的哈希代码组织起来的键/值对。它使用键来访问集合中的元素。
当您使用键访问元素时,则使用哈希表,而且您可以识别一个有用的键值。哈希表中的每一个都有一个键/值对。键用于访问集合中的项目。 ——菜鸟教程 https://www.runoob.com/

1).声明:

HashTable xxx=new HashTable();

2).属性

属性描述
Count获取 Hashtable 中包含的键值对个数
IsFixedSize获取一个值,表示 Hashtable 是否具有固定大小
IsReadOnly获取一个值,表示 Hashtable 是否只读
Item获取或设置与指定的键相关的值
Keys获取一个 ICollection,包含 Hashtable 中的键
Values获取一个 ICollection,包含 Hashtable 中的值

3).方法

.Add(key,value)在哈希表中添加一对键值对 例:table.Add(w.id,w)
.Remove(key) 删除键值 例:table.Remove(5)
.Contains(key) 检测是否包含此键值对
.ContainsKey(key) 检测是否包含这个键
.ContainsValue(value) 检测是否包含这个值

4).访问:索引器[键]
遍历,使用foreach去键/值的集合中把每个元素都取到
*例:

static void Main(string[] args)
{
    Hashtable ht = new Hashtable();
    
    ht.Add("001", "Zara Ali");
    ht.Add("002", "Abida Rehman");
    ht.Add("003", "Joe Holzner");
    ht.Add("004", "Mausam Benazir Nur");
    ht.Add("005", "M. Amlan");
    ht.Add("006", "M. Arif");
    ht.Add("007", "Ritesh Saikia");
    
    if (ht.ContainsValue("Nuha Ali"))
    {
        Console.WriteLine("This student name is already in the list");
    }
    else
    {
        ht.Add("008", "Nuha Ali");
    }
    // 获取键的集合
    ICollection key = ht.Keys; //获取一个 ICollection,包含 Hashtable 中的键
    foreach (string k in key)
    {
        Console.WriteLine(k + ": " + ht[k]);
    }    
}
//源码来自 菜鸟教程 https://www.runoob.com/

控制台输出结果:离散分布,显示没有规律


007: Ritesh Saikia
004: Mausam Benazir Nur
005: M. Amlan
008: Nuha Ali
002: Abida Rehman
003: Joe Holzner
001: Zara Ali
006: M. Arif


3. 排序列表(SortedList)

SortedList 类代表了一系列按照键来排序的键/值对,这些键值对可以通过键和索引来访问。
排序列表是数组和哈希表的组合。它包含一个可使用键或索引访问各项的列表。如果您使用索引访问各项,则它是一个动态数组(ArrayList),如果您使用键访问各项,则它是一个哈希表(Hashtable)。集合中的各项总是按键值排序。 ——菜鸟教程 https://www.runoob.com/

1).声明:

SortedList xxx=new SortedList();

2).属性

属性描述
Count获取SortedList 中实际包含的元素个数
Capacity获取或设置 SortedList 可以包含的元素个数
IsFixedSize获取一个值,表示 SortedList是否具有固定大小
IsReadOnly获取一个值,表示 SortedList是否只读
IItem获取或设置与 SortedList 中指定的键相关的值
Keys获取一个 ICollection,包含 Hashtable 中的键
Values获取一个 ICollection,包含 Hashtable 中的值

3).方法
.Add(key,value) 添加一对键值对 例:list.Add(w.id,w)
.Remove(key)删除带有指定键的值 例:list.Remove(5)
.RemoveAt(int index) 移除 SortedList 的指定索引处的元素
.ContainsKey(key)检测是否包含这个键
.ContainsValue(value) 检测是否包含这个值
.GetByIndex(int index) 获取 SortedList 的指定索引处的值
.GetKey(int index) 获取 SortedList 的指定索引处的键
.GetKeyList() 获取 SortedList 中的键
.GetValueList() 获取 SortedList 中的值
.IndexOfKey(object key) 返回 SortedList 中的指定键的索引,索引从零开始

4).访问:索引器[键]
遍历使用foreach去键/值的集合中把每个元素都取到,并且按序排列

4. 堆栈(Stack)

堆栈(Stack)代表了一个后进先出的对象集合。当您需要对各项进行后进先出的访问时,则使用堆栈。当您在列表中添加一项,称为推入元素,当您从列表中移除一项时,称为弹出元素。 ——菜鸟教程 https://www.runoob.com/

1).声明:

Stack xx=new Stack();

2).属性

属性描述
Count获取 Stack 中包含的元素个数

3).方法
栈的释放顺序是先进后出(后进先出)
压栈.Push(object 对象)把这个对象添加到栈的顶部
弹栈.Pop()把栈顶的元素弹出来,会删除
.Peek()返回栈顶的元素,不删除
检测是否包含: .Contains(object value)
在遍历弹栈的时候要注意,Pop方法会删除你的对象,导致Count属性发生改变,所以,应该用一个变量存储一下一开始的Count值根据这个变量,来弹栈,就可以把栈中所有的数据弹出去

public virtual object [ ] ToArray();    //复制 Stack 到一个新的数组中。

5 .队列(Queue)

队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队。 ——菜鸟教程 https://www.runoob.com/

1).声明:
Queue que=new Queue();

2).属性

属性描述
Count获取 Queue 中包含的元素个数

3).方法

队列的释放顺序是先进先出
.EnQueue(Object value)队列的末尾处添加
.DeQueue()返回并移除队列最前面的那个元素
.Peek()把队列中队首的元素返回,但不删除
检测是否包含: .Contains(object value)

public virtual object [ ] ToArray();    //复制 Queue 到一个新的数组中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值