转载自: 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>泛型类在定义变量是需要指定当前存储的键值对类型,如:

 Dictionary<string, string> hashMap = newDictionary<string, string>();

补充说明:
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编程网的更多相关文章

  1. ECMAScript 6中的Set和Map数据结构

    一.Set 基本用法: Set本身是一个构造函数,用来生成Set数据结构.Set函数可以接受一个数组作为参数用来初始化. const arr = new Set([2,2,3,3,4,4,5,8]); ...

  2. ES6中的Set、Map数据结构

    Map.Set都是ES6新的数据结构,他们都是新的内置构造函数.也就是说typeof的结果,多了两个. 他们是什么:  Set是不能重复的数组.    Map是可以任何东西当做键的对象: ES6 提供 ...

  3. ES6中的Set与Map数据结构

    本文实例讲述了ES6学习笔记之Set和Map数据结构.分享给大家供大家参考,具体如下: 一.Set ES6提供了新的数据结构Set.类似于数组,只不过其成员值都是唯一的,没有重复的值. Set本身是一 ...

  4. javascript中的Set和Map数据结构

    Set数据结构 类似数组,所有的数据都是唯一的,没有重复值,它本身是一个构造函数 size 数据长度 add() 添加一个数据 delete() 删除一个数据 has() 查找一个数据 clear() ...

  5. es6入门7--Set Map数据结构

    本文作为ES6入门第十三章的学习整理笔记,可能会包含少部分个人的理解推测,若想阅读更详细的介绍,还请阅读原文ES6入门 一.set数据结构 1.set不接受重复值 ES6新增了Set构造函数用于创建s ...

  6. ES6中Map数据结构学习笔记

    很多东西就是要细细的品读然后做点读书笔记,心理才会踏实- Javascript对象本质上就是键值对的集合(Hash结构),但是键只能是字符串,这有一定的限制. 1234 var d = {}var e ...

  7. Java集合中List,Set以及Map等集合体系详解

    转载请注明出处:Java集合中List,Set以及Map等集合体系详解(史上最全) 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有H ...

  8. 词典的实现(3)--使用JAVA类库ArrayList实现Map数据结构

    1,在词典的实现(2)-借助顺序表(数组)实现词典文章中使用了自定义的数组代替ArrayList,并实现了Map数据结构的基本功能.而借助JAVA类库ArrayList类的一些方法可以更加容易地实现M ...

  9. 11 Set和Map数据结构

    Set和Map数据结构 Set WeakSet Map WeakMap 首先 这四个对象都是 数据结构. 用于存放数据 Set 类似数组. 但是不能重复. 如果你有重复数据,会自动忽略 属性 size ...

随机推荐

  1. Android tablayout增加选择tab 的事件.

    tablayout在点击或者滑动的时候会触发监听事件  , 当你调用这个方法的时候 会触发事件 mTablayout.addOnTabSelectedListener(new TabLayout.On ...

  2. jQuery学习(三)——选择器总结

    1.基本选择器 id选择器:$(“#id名称”); 元素选择器:$(“元素名称”); 类选择器:$(“.类名”); 通配符:* 多个选择器共用(并集) 案例代码: <!DOCTYPE html& ...

  3. 如何防止js刷新页面后倒计时改变

    1.存入cookie或localstorage(清除浏览器缓存后时间依然改变) 2.存入数据库

  4. 函数签名与消息转发:NSInvocation与NSMethodSignature

    具体可见 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Article ...

  5. Node_进阶_3

    Express框架: 一.   Express框架 Express框架是后台的Node框架,类似于JS中的jquery. #原生Node开发会有很多问题: 1呈递静态页面很不方便,需要处理每个HTTP ...

  6. 小程序canvas生成二维码图片踩的坑

    1:生成临时图片,保证画布被加载以及渲染(即本身不可以 hidden 或是 上级元素不可以 hidden 或是 wx:if 隐藏等) == > 建议:因为 canvas 的组件层级(z-inde ...

  7. JQ 添加节点和插入节点的方法总结

    转载来源:http://blog.csdn.net/ss1106404013/article/details/49274345 添加节点的jQuery方法: append().prepend().ap ...

  8. oracle和mysql的分页

    如果我们是通过JDBC的方式访问数据库,那么就有必要根据数据库类型采取不同的SQL分页语句,对于MySql数据库,我们可以采用limit语句进行分页,对于Oracle数据库,我们可以采用rownum的 ...

  9. LibSVM C/C++

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50179779 在LibSVM的库的sv ...

  10. EularProject 42:单词解码出来的三角形数

    Coded triangle numbers Problem 42 The nth term of the sequence of triangle numbers is given by, tn = ...