目录
Queue是一个先进先出的数据结构
Queue分别提供了非泛型和泛型版本的实现,适用于需要按照入队顺序处理数据的场景
队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队
特性
-
先进先出:最早加入队列的元素最先被移除
-
动态大小:队列的容量会根据需要动态调整
-
泛型支持:通过Queue<T>可以存储强类型的元素
-
线程安全:Queue本身不是线程安全的,但可以使用ConcurrentQueue<T>实现线程安全
Queue 类的方法和属性
属性
属性名称 | 类型 | 描述 |
---|---|---|
Count | int | 获取哈希表中包含的键值对数量。 |
IsReadOnly | bool | 指示哈希表是否为只读。 |
IsFixedSize | bool | 指示哈希表是否具有固定大小。 |
IsSynchronized | bool | 指示哈希表是否线程安全。 |
Keys | ICollection | 获取哈希表中所有键的集合。 |
Values | ICollection | 获取哈希表中所有值的集合。 |
SyncRoot | object | 获取可用于同步访问哈希表的对象。 |
方法
方法名称 | 返回类型 | 描述 |
---|---|---|
添加与删除 | ||
Add(object key, object value) | void | 将指定的键值对添加到哈希表。 |
Clear() | void | 清空哈希表。 |
Remove(object key) | void | 删除指定键的键值对。 |
查询与访问 | ||
Contains(object key) | bool | 判断哈希表中是否包含指定键。 |
ContainsKey(object key) | bool | 判断哈希表中是否包含指定键(等效于 Contains )。 |
ContainsValue(object value) | bool | 判断哈希表中是否包含指定值。 |
复制与枚举 | ||
CopyTo(Array array, int index) | void | 将哈希表的元素复制到数组,从指定索引处开始。 |
GetEnumerator() | IDictionaryEnumerator | 返回哈希表的枚举器,用于遍历键值对。 |
代码案例:
using System;
using System.Collections;
namespace CollectionsApplication
{
class Program
{
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;
foreach (string k in key)
{
Console.WriteLine(k + ": " + ht[k]);
}
Console.ReadKey();
}
}
}
与Dictionary<TKey, TValue>
的对比
特性 | Hashtable | Dictionary<TKey, TValue> |
---|---|---|
类型安全 | 否(非泛型,存储 object 类型) | 是(泛型,强类型约束) |
性能 | 较慢(需进行装箱和拆箱操作) | 更快(无装箱操作,泛型直接支持类型) |
键的唯一性 | 是 | 是 |
值是否可为 null | 是 | 是 |
排序 | 无 | 无 |
线程安全 | 默认非线程安全 | 默认非线程安全 |
-
Hashtable
是一种高效的键值对集合,适用于需要快速存储和检索键值对的场景。 -
非泛型 的设计使其在类型安全和性能方面逊色于泛型版本的集合(如
Dictionary<TKey, TValue>
)。 -
在现代 C# 开发中,
Dictionary<TKey, TValue>
更常被使用,但Hashtable
仍然适合简单应用或与遗留代码兼容的场景。
字典Dictionary
Dictionary理解
字典是一种非常有用的数据结构,属于,用于存储键值对,其中每个键都唯一地映射到一个值
-
关于字典我们可以简单理解成一个萝卜一个坑。每一个标记有不重复编号的坑只可以放一个萝卜或者其他的东西
-
Dictionary有key跟value,一个键只能对应一种值
-
每一个有编号的坑即为 Dictionary中的键(key)
-
每一个坑里的萝卜即为Dictionary中的值(value)
-
-
一个value可以对应很多个key,但是key是唯一的。好比学生和成绩,学生是唯一的,每个学生都有对应的成绩,但是会有很多学生考相同的成绩
特性
-
有泛型优势(类型安全,性能更好),对于值类型,不存在装箱和拆箱的性能损耗
-
读取速度快(体现在单条数据上)
-
容量利用更充分
-
有序(遍历时输出的顺序就是加入的顺序)
-
通过键快速查找、插入和删除对应的值
Dictionary声明
-
在声明Dictionary字典时,需要同时为其声明Dictionary字典内键与值的类型
-
示例:Dictionary<int,string> dictionary = new Dictionary<int,string>()
键与值可以是任何类型,但是键必须在设置时是唯一的,而值可以不唯一,就好比每个学生的学号必须是唯一的,而所有的成绩可以不唯一
Dictionary<int,string> dic = new Dictionary<int,string>();
//方式一:Add方法赋值
dic.Add(1,"98分");
dic.Add(2,"95分");
dic.Add(3,"93分");
dic.Add(4,"90分");
//方式二:索引器赋值
dic[5] = "92分";
//方法三:对象初始器
Dictionary<string,string> dic2 = new Dictionary<string,string>(){
{"A","aa"},
{"B","bb"},
{"C","cc"}
};
总结:
- 键与值可以是任何类型,但是键必须在设置时是唯一的,而值可以不唯一
- 使用Add()方法添加键值对,不可添加已有的键名
- 索引模式可以新赋值也可以修改已有的键值
接口说明
集合接口继承关系
常见的集合和列表实现接口
类 | 描述和用法 |
---|---|
IEnumerator<T> | 这个接口定义了方法GetEnumerator(),返回一个实现了IEnumerator接口的枚举,如果将forEach语句用于集合,就需要实现该接口 |
ICollection<T> | ICollection<T>接口由泛型集合类实现,使用这个接口可以获取集合中的元素个数(count),吧集合赋值到数组中(Copy To()),还可以添加和删除元素 |
IList<T> | IList<T>接口用于可通过位置访问其中的元素列表,这个接口定义了一个索引器,可以在集合指定位置插入或删除某些项,List<T>接口派生自ICollection<T>接口 |
IDictionary<TKey,TValue> | IDictionary<TKey,TValue>接口由包含键和值的泛型集合类实现。使用这个接口可以访问所有的键和值。使用键类型的索引器可以访问某些项,还可以添加或删除某些项 |