C#中使用Dictionary实现Map数据结构——VC编程网
转载自: http://blog.51cto.com/psnx168
在VC中使用过CMap以及在Java中使用过Map的朋友应该很熟悉,使用Map可以方便实现基于键值对数据的处理,在C#中,你就需要实现IDictionary接口的关键字值集合类,允许通过关键字(如字符串名)进行索引,这也可以使用索引符来完成,但这种索引符参数是与存储的项相关联的关键字,而不是int索引。通常情况下,我们使用泛型类Dictionary来实现这样的功能。
Dictionary泛型类提供快速的基于键值的元素查找,Dictionary<K, V>是一个泛型 ,他本身有集合的功能有时候可以把它看成数组,它的结构是这样的:Dictionary<[key], [value]> ,他的特点是存入对象是需要与[key]值一一对应的存入该泛型 ,通过某一个一定的[key]去找到对应的值。Dictionary<K, V>泛型类在定义变量是需要指定当前存储的键值对类型,如:
补充说明:
1、必须包含名空间System.Collection.Generic
2、Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值)
3、键必须是唯一的,而值不需要唯一的
4、键和值都可以是任何类型(比如:string, int, 自定义类型,等等)
5、通过一个键读取一个值的时间是接近O(1)
6、键值对之间的偏序可以不定义
首先给出一个使用泛型类Dictionary<K, V>的完整例子,其中包含了创建和初始化一个Dictionary对象、判断是否存在相应的key并显示、遍历所有的Keys、遍历所有的Values、遍历整个字典。
C#代码:
/// <summary>
/// Dictionary的基本用法
/// </summary>
staticvoidDictionaryDemo()
{
Dictionary<int, string> dict = newDictionary<int, string>();
dict.Add(, "");
dict.Add(, "");
//判断是否存在相应的key并显示
if(dict.ContainsKey())
{
Console.WriteLine(dict[]);
}
//遍历Keys
foreach(var item indict.Keys)
{
Console.WriteLine("Key:{0}", item);
}
//遍历Values
foreach(var item indict.Values)
{
Console.WriteLine("value:{0}", item);
}
//遍历整个字典
foreach(var item indict)
{
Console.WriteLine("key:{0} value:{1}", item.Key, item.Value);
}
}
下面对一些比较重要的用法进行补充介绍:
1.在字典Dictionary<K, V>中查找指定键的元素
staticvoidTest(string[] args)
{
Dictionary<string, int> d = newDictionary<string, int>();
d.Add("C#", );
d.Add("VB", );
d.Add("C", );
d.Add("C++", -);
//判断字典中是否包含键为“VB”的元素
if(d.ContainsKey("VB")) // True
{
intp = d["VB"];
Console.WriteLine(p);
}
//判断字典中是否包含键为“C”的元素
if(d.ContainsKey("C"))
{
intp1 = d["C"];
Console.WriteLine(p1);
}
}
2.在字典Dictionary<K, V>中删除指定键的元素
staticvoidTest(string[] args)
{
Dictionary<string, int> d = newDictionary<string, int>();
d.Add("C#", );
d.Add("VB", );
d.Add("C", );
d.Add("C++", -);
//删除键为“C”的元素
d.Remove("C");
//删除键为“VB”的元素
d.Remove("VB");
}
3.使用ContainsValue查找值的存在
staticvoidTest(string[] args)
{
Dictionary<string, int> d = newDictionary<string, int>();
d.Add("C#", );
d.Add("VB", );
d.Add("C", );
d.Add("C++", -);
if(d.ContainsValue())
{
Console.WriteLine("VB");
}
if(d.ContainsValue())
{
Console.WriteLine("C#");
}
if(d.ContainsValue())
{
Console.WriteLine("C");
}
if(d.ContainsValue(-))
{
Console.WriteLine("C++");
}
}
4.KeyNotFoundException异常说明
如果你尝试读取字典中一个不存在的键,那么你会得到一个KeyNotFoundException。所有在读取一个键之前,你必须先使用ContainKey来核对键是否存在字典中。
5.排序字典SortedDictionary
对一个Dictionary<TKey, TValue>进行键排序可以直接用SortedDictionary, SortedDictionary<TKey, TValue>
泛型类是检索运算复杂度为 O(log n) 的二叉搜索树,其中 n 是字典中的元素数。就这一点而言,它与 SortedList<TKey, TValue> 泛型类相似。
这两个类具有相似的对象模型,并且都具有 O(log n) 的检索运算复杂度。这两个类的区别在于内存的使用以及插入和移除元素的速度:SortedList<TKey, TValue> 使用的内存比
SortedDictionary<TKey, TValue> 少,SortedDictionary<TKey, TValue> 可对未排序的数据执行更快的插入和移除操作:它的时间复杂度为 O(log n),而 SortedList<TKey,
TValue> 为 O(n),如果使用排序数据一次性填充列表,则 SortedList<TKey, TValue> 比 SortedDictionary<TKey,
TValue> 快。每个键/值对都可以作为 KeyValuePair<TKey, TValue> 结构进行检索,或作为 DictionaryEntry 通过非泛型 IDictionary 接口进行检索。只要键用作
SortedDictionary<TKey, TValue> 中的键,它们就必须是不可变的。SortedDictionary<TKey, TValue> 中的每个键必须是唯一的。键不能为 null,但是如果值类型 TValue 为引用类型,该值则可以为空。SortedDictionary<TKey, TValue> 需要比较器实现来执行键比较。可以使用一个接受 comparer 参数的构造函数来指定 IComparer<T> 泛型接口的实现;如果不指定实现,则使用默认的泛型比较器 Comparer<T>.Default。
如果类型 TKey 实现System.IComparable<T> 泛型接口,则默认比较器使用该实现。
总结
在这篇文章中,简要地介绍C#中的Dictionary<K,V>泛型字典的使用,通过它,你可以实现java和C++中Map集合类一样强大功能,通过本文的学习,你应该学会了Dictionary中如何添加键值、查找键值、删除元素等基本操作吧。
C#中使用Dictionary实现Map数据结构——VC编程网的更多相关文章
- ECMAScript 6中的Set和Map数据结构
一.Set 基本用法: Set本身是一个构造函数,用来生成Set数据结构.Set函数可以接受一个数组作为参数用来初始化. const arr = new Set([2,2,3,3,4,4,5,8]); ...
- ES6中的Set、Map数据结构
Map.Set都是ES6新的数据结构,他们都是新的内置构造函数.也就是说typeof的结果,多了两个. 他们是什么: Set是不能重复的数组. Map是可以任何东西当做键的对象: ES6 提供 ...
- ES6中的Set与Map数据结构
本文实例讲述了ES6学习笔记之Set和Map数据结构.分享给大家供大家参考,具体如下: 一.Set ES6提供了新的数据结构Set.类似于数组,只不过其成员值都是唯一的,没有重复的值. Set本身是一 ...
- javascript中的Set和Map数据结构
Set数据结构 类似数组,所有的数据都是唯一的,没有重复值,它本身是一个构造函数 size 数据长度 add() 添加一个数据 delete() 删除一个数据 has() 查找一个数据 clear() ...
- es6入门7--Set Map数据结构
本文作为ES6入门第十三章的学习整理笔记,可能会包含少部分个人的理解推测,若想阅读更详细的介绍,还请阅读原文ES6入门 一.set数据结构 1.set不接受重复值 ES6新增了Set构造函数用于创建s ...
- ES6中Map数据结构学习笔记
很多东西就是要细细的品读然后做点读书笔记,心理才会踏实- Javascript对象本质上就是键值对的集合(Hash结构),但是键只能是字符串,这有一定的限制. 1234 var d = {}var e ...
- Java集合中List,Set以及Map等集合体系详解
转载请注明出处:Java集合中List,Set以及Map等集合体系详解(史上最全) 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有H ...
- 词典的实现(3)--使用JAVA类库ArrayList实现Map数据结构
1,在词典的实现(2)-借助顺序表(数组)实现词典文章中使用了自定义的数组代替ArrayList,并实现了Map数据结构的基本功能.而借助JAVA类库ArrayList类的一些方法可以更加容易地实现M ...
- 11 Set和Map数据结构
Set和Map数据结构 Set WeakSet Map WeakMap 首先 这四个对象都是 数据结构. 用于存放数据 Set 类似数组. 但是不能重复. 如果你有重复数据,会自动忽略 属性 size ...
随机推荐
- Chrome浏览器查看SSL证书信息
1.https使用f12打开,选中security 如果F12打不开,可以通过最右端的自定义及控制chrome菜单,打开"更多工具"-->"开发者工具" ...
- XML学习(一)——xml内容简介
一.什么是XML xml全称为Extensible Markup Language,意思是可扩展的标记语言.XML语法上和HTML比较相似,但是HTML中的元素是固定的,而XML的标签是可以用户定义的 ...
- solarwind之安装
1. 安装组件 2. 安装组件sql 3. 安装 4. 接受协议 5. 安装路径 6. 安装状态 7. 继续 8. 激活 9. 完成安装
- css3实现轮播图
css3动画属性简写: animation: name duration timing-function delay iteration-count direction fill-mode ...
- php 扩展 suhosin 配置不当引发的报错及其解决方法
1. /var/log/messages 频繁报错: Jul :: localhost suhosin[]: ALERT - script tried to increase memory_limit ...
- 虚拟机创建后该如何获取IP地址并访问互联网实用教程
之前在做项目的时候主机IP地址.网关.DNS.子网掩码等都是公司或者对方直接给提供的,但是如果我们自己想搭建一台虚拟机或者一台集群的话,手头又没有IP地址,该肿么办呢? 白慌,这里介绍一个小技巧, ...
- windows下安装redis以及测试 Window 下安装
下载地址:https://github.com/dmajkic/redis/downloads. 下载到的Redis支持32bit和64bit.根据自己实际情况选择,将64bit的内容cp到自定义盘符 ...
- C语言声明语句
设计理念: C语言的一个设计理念就是声明变量和使用变量的形式应该是一致的 优点:声明变量和使用变量时的运算符优先级是相同的 缺点:运算符的优先级是C语言过度解析的部分之一 术语: 变量声明中使用到的符 ...
- Oralce中的package和package body
1.Oracle Package的作用: 可以简化应用设计.提高应用性能.实现信息隐藏.子程序重载 2.ORACLE中的function .package.package bodies.pro ...
- caioj 1157 线性筛选素数
注意这道题开得非常大,有2*1e7 自己可以养成一种习惯,如果数据是很容易的话,可以自己手动输入极限数据来测试自己的程序 #include<cstdio> #include<algo ...