C#哈希表(Hashtable)/字典(Dictionary)

目录

特性

Queue 类的方法和属性

与Dictionary 的对比

字典Dictionary

Dictionary理解

特性

Dictionary声明

总结:

接口说明

Queue是一个先进先出的数据结构

Queue分别提供了非泛型和泛型版本的实现,适用于需要按照入队顺序处理数据的场景

队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队

特性

  • 先进先出:最早加入队列的元素最先被移除

  • 动态大小:队列的容量会根据需要动态调整

  • 泛型支持:通过Queue<T>可以存储强类型的元素

  • 线程安全:Queue本身不是线程安全的,但可以使用ConcurrentQueue<T>实现线程安全

Queue 类的方法和属性

属性

属性名称类型描述
Countint获取哈希表中包含的键值对数量。
IsReadOnlybool指示哈希表是否为只读。
IsFixedSizebool指示哈希表是否具有固定大小。
IsSynchronizedbool指示哈希表是否线程安全。
KeysICollection获取哈希表中所有键的集合。
ValuesICollection获取哈希表中所有值的集合。
SyncRootobject获取可用于同步访问哈希表的对象。

方法

方法名称返回类型描述
添加与删除
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>的对比

特性HashtableDictionary<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>接口由包含键和值的泛型集合类实现。使用这个接口可以访问所有的键和值。使用键类型的索引器可以访问某些项,还可以添加或删除某些项

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值