C# .Net 中字典Dictionary<TKey,TValue>泛型类 学习浅谈
一、综述:
Dictionary<TKey,TValue>是在 .NET Framework 2.0 版中是新增的。表示键值对的集合,Dictionary<TKey,TValue>类是作为一个哈希表来实现的,通过键来检索值的速度非常快(检索速度取决于为 TKey 指定的类型的哈希算法的质量),接近于 O(1),效率比List<T>高很多。
二、常用方法:
示例:
var dict = new Dictionary<int, string>();
for (var i = ; i < ; i++)
{
dict[i] ="a"+i.ToString();
}
1. 获取值(TValue)
a. 利用键索引,字典中不存在该键时会抛出异常。
var rt1= dict[];
b. TryGetValue(Tkey,out TValue) 推荐使用,第一个参数是键,第二个是获取相关联的值。如果未找到键,获取适当的默认值;例如,为 int 类型为 0,bool为 false,引用类型为null,例如string。该方法返回类型为bool类型,找到并成功获取到值返回true,否则返回false。
string rt2;
var rtBool = dict.TryGetValue(, out rt2);
2. 获取其中的项(键值对)KeyValuePair<TKey, TValue>
a. First(),属于扩展方法。 返回字典中的第一个匹配项,返回的结果是一个键值对。当没有找到匹配项的时候引发异常
var r3 = dict.First(j => j.Key == );
b. FirstOrDefault(),属于扩展方法。返回字典中的第一个匹配项,结果也是一个键值对,没有找到匹配项时不引发异常,且返回一个默认的键值对。例如,TValue为 int 类型为 0,bool为 false,引用类型为null。这个与常规的返回值不一样,需要特别注意。
var r4 = dict.FirstOrDefault(j => j.Key == );
没有找到的返回结果
3. ContainsKey(TKey) 确定 Dictionary<TKey, TValue> 是否包含指定的键(TKey)。返回值类型为bool
var r5 = dict.ContainsKey();
4. ContainsValue(TValue) 确定 Dictionary<TKey, TValue> 是否包含特定值(TValue)。返回值类型为bool
var r6 = dict.ContainsValue("a1");
5. 新添加值 Add(TKey,TValue) ,没有返回值,如果插入失败(例如插入重复键)将引发异常。
dict.Add(, "a11");
需要注意的是利用dict[TKey]=TValue同样可以实现插入,但同时也是编辑。它等同于
if (dict.ContainsKey())
{
dict[] = "a11";//修改更新
}
else
{
dict.Add(,"a11");//插入添加
}
6. 删除 Remove(TKey),返回值为bool型。如果成功找到并移除该元素,则为 true;否则为 false。如果是循环查找删除,不可以使用foreach,应当使用for。否则可能会引发异常。
var keyArray = dict.Keys.ToArray();
for (var i = ; i < keyArray.Length; i++)
{
if (dict[keyArray[i]].Contains("a"))
{
var r7 = dict.Remove(keyArray[i]);
}
}
7. 清空字典 Clear() ,没有参数,也没有返回值。该方法会把集合中的元素对其他对象的引用也被释放。 容量保持不变。此方法的运算复杂度为 O(n),其中 n 是字典的容量。
dict.Clear()
三、注:
1. Dictionary<TKey,TValue>中的任何键都必须是唯一的。
2. 键不能为空引用,但是如果值类型 TValue 为引用类型,该值则可以为空。
3. foreach 语句是对枚举数的包装,只允许该枚举数读取集合,而不允许对Dictionary<TKey,TValue>写入、删除。
4. 只要不修改该集合,Dictionary<TKey, TValue> 就可以同时支持多个阅读器。 即便如此,从头到尾对一个集合进行枚举本质上并不是一个线程安全的过程。 当出现枚举与写访问互相争用这种极少发生的情况时,必须在整个枚举过程中锁定集合。 若要允许多个线程访问集合以进行读写操作,则必须实现自己的同步。
C# .Net 中字典Dictionary<TKey,TValue>泛型类 学习浅谈的更多相关文章
- C#中数组、集合(ArrayList)、泛型集合List<T>、字典(dictionary<TKey,TValue>)全面对比
C#中数组.集合(ArrayList).泛型集合List<T>.字典(dictionary<TKey,TValue>)全面对比 为什么把这4个东西放在一起来说,因为c#中的这4 ...
- C# 字典 Dictionary<Tkey,Tvalue>
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来.我们都知道计算机技术发展日新月异,速度惊人的快,你我稍不留神,就会被慢慢淘汰!因此:每日不间断的学习是避免被 ...
- C#编程(五十三)----------字典Dictionary<TKey,TValue>
字典 关键字:Dicitionary 说明: 必须包含命名空间System.Collection.Generic Dictionary里面的每一个元素都是一个键值对(由两个元组组成:键和值). 键必须 ...
- C#字典 Dictionary<Tkey,Tvalue> 之线程安全问题 ConcurrentDictionary<Tkey,Tvalue> 多线程字典
ConcurrentDictionary<Tkey,Tvalue> Model #region 程序集 mscorlib, Version=4.0.0.0, Culture=neutra ...
- .NET中Dictionary<TKey, TValue>浅析
.NET中Dictionary<TKey, Tvalue>是非常常用的key-value的数据结构,也就是其实就是传说中的哈希表..NET中还有一个叫做Hashtable的类型,两个类型都 ...
- Dictionary<TKey, TValue> 类
C# Dictionary<TKey, TValue> 类 Dictionary<TKey, TValue> 泛型类提供了从一组键到一组值的映射.字典中的每个添加项都由一个值及 ...
- .net框架-字典对象 Hashtable & Dictionary<TKey,TValue> & SortedList
字典对象: 字典对象是表示键值对的集合 字典对象有Hashtable(.net 1.0)及其泛型版本Dictionary<TKey,TValue> 字典对象还包括SortedList及其泛 ...
- Dictionary<Tkey.TValue>与SortedList
一.概述 表示Key/Value集合,可以添加删除元素,允许按Key来访问元素.是Hashtable的泛型等效类. 它需要一个相等实现来确定键是否相等,可以使用实现了IEqualityComparer ...
- “线程安全的” Dictionary(TKey,TValue)
这是一篇翻译,专门介绍Dictionary线程安全问题,原文网址如下 http://www.grumpydev.com/2010/02/25/thread-safe-dictionarytkeytva ...
随机推荐
- Python使用turtle库与random库绘制雪花
记录Python使用turtle库与random库绘制雪花,代码非常容易理解,画着玩玩还是可以的. 完整代码如下: 效果图如下:
- Linux程序宕掉后如何通过gdb查看出错信息
我们在编写服务端程序的时候,由于多线程并且环境复杂,程序可能在不确定条件的情况下宕掉,还不好重新,这是我们如何获取程序的出错信息,一种方法通过打日志,有时候一些错误日志也不能体现出来,这时就用到我们的 ...
- Python——Twisted框架(网络通信)
一.简介 twisted是一个封装好的网络通信的库,可以帮助我们快速进行网络编程.注意,python3中,字符串必须转码成utf8的格式,否则无法发送.比如str("test"). ...
- Qin Shi Huang's National Road System HDU - 4081(树形dp+最小生成树)
Qin Shi Huang's National Road System HDU - 4081 感觉这道题和hdu4756很像... 求最小生成树里面删去一边E1 再加一边E2 求该边两顶点权值和除以 ...
- python学习日记(OOP——反射)
反射 反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函数,并执行.利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! hasattr ...
- SQL随记(三)
1.关于package: 包的作用:可以将任何出现在块声明的语句(过程,函数,游标,游标,类型,变量)放入包中,相当于一个容器. 包的好处:在包中的(过程,函数,游标,游标,类型,变量)相当于sql/ ...
- 非关系型数据库之Redis
一.Redis简介 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. Redis是一个开源的使用 ...
- Kubernetes之Pod 控制器
定义Pod的常用资源 pods.spec.containers - name <string> #containers 的名字 image <string> ...
- CMDB服务器管理系统【s5day88】:采集资产-文件配置(一)
django中间件工作原理 整体流程: 在接受一个Http请求之前的准备 启动一个支持WSGI网关协议的服务器监听端口等待外界的Http请求,比如Django自带的开发者服务器或者uWSGI服务器. ...
- Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...