转载自: http://blog.51cto.com/psnx168java
在VC中使用过CMap以及在Java中使用过Map的朋友应该很熟悉,使用Map能够方便实现基于键值对数据的处理,在C#中,你就须要实现IDictionary接口的关键字值集合类,容许经过关键字(如字符串名)进行索引,这也能够使用索引符来完成,但这种索引符参数是与存储的项相关联的关键字,而不是int索引。一般状况下,咱们使用泛型类Dictionary来实现这样的功能。
Dictionary泛型类提供快速的基于键值的元素查找,Dictionary<K, V>是一个泛型 ,他自己有集合的功能有时候能够把它当作数组,它的结构是这样的:Dictionary<[key], [value]> ,他的特色是存入对象是须要与[key]值一一对应的存入该泛型 ,经过某一个必定的[key]去找到对应的值。Dictionary<K, V>泛型类在定义变量是须要指定当前存储的键值对类型,如:数组
补充说明:
一、必须包含名空间System.Collection.Generic
二、Dictionary里面的每个元素都是一个键值对(由二个元素组成:键和值)
三、键必须是惟一的,而值不须要惟一的
四、键和值均可以是任何类型(好比:string, int, 自定义类型,等等)
五、经过一个键读取一个值的时间是接近O(1)
六、键值对之间的偏序能够不定义
首先给出一个使用泛型类Dictionary<K, V>的完整例子,其中包含了建立和初始化一个Dictionary对象、判断是否存在相应的key并显示、遍历全部的Keys、遍历全部的Values、遍历整个字典。
C#代码:函数
1 /// <summary> 2 /// Dictionary的基本用法 3 /// </summary> 4 staticvoidDictionaryDemo() 5 { 6 Dictionary<int, string> dict = newDictionary<int, string>(); 7 dict.Add(1, "111"); 8 dict.Add(2, "222"); 9 //判断是否存在相应的key并显示 10 if(dict.ContainsKey(2)) 11 { 12 Console.WriteLine(dict[2]); 13 } 14 //遍历Keys 15 foreach(var item indict.Keys) 16 { 17 Console.WriteLine("Key:{0}", item); 18 } 19 //遍历Values 20 foreach(var item indict.Values) 21 { 22 Console.WriteLine("value:{0}", item); 23 } 24 //遍历整个字典 25 foreach(var item indict) 26 { 27 Console.WriteLine("key:{0} value:{1}", item.Key, item.Value); 28 } 29 }
下面对一些比较重要的用法进行补充介绍:
学习
1 staticvoidTest(string[] args) 2 { 3 Dictionary<string, int> d = newDictionary<string, int>(); 4 d.Add("C#", 2); 5 d.Add("VB", 1); 6 d.Add("C", 0); 7 d.Add("C++", -1); 8 //判断字典中是否包含键为“VB”的元素 9 if(d.ContainsKey("VB")) // True 10 { 11 intp = d["VB"]; 12 Console.WriteLine(p); 13 } 14 //判断字典中是否包含键为“C”的元素 15 if(d.ContainsKey("C")) 16 { 17 intp1 = d["C"]; 18 Console.WriteLine(p1); 19 } 20 }
1 staticvoidTest(string[] args) 2 { 3 Dictionary<string, int> d = newDictionary<string, int>(); 4 d.Add("C#", 2); 5 d.Add("VB", 1); 6 d.Add("C", 0); 7 d.Add("C++", -1); 8 //删除键为“C”的元素 9 d.Remove("C"); 10 //删除键为“VB”的元素 11 d.Remove("VB"); 12 }
1 staticvoidTest(string[] args) 2 { 3 Dictionary<string, int> d = newDictionary<string, int>(); 4 d.Add("C#", 2); 5 d.Add("VB", 1); 6 d.Add("C", 0); 7 d.Add("C++", -1); 8 if(d.ContainsValue(1)) 9 { 10 Console.WriteLine("VB"); 11 } 12 if(d.ContainsValue(2)) 13 { 14 Console.WriteLine("C#"); 15 } 16 if(d.ContainsValue(0)) 17 { 18 Console.WriteLine("C"); 19 } 20 if(d.ContainsValue(-1)) 21 { 22 Console.WriteLine("C++"); 23 } 24 }
若是你尝试读取字典中一个不存在的键,那么你会获得一个KeyNotFoundException。全部在读取一个键以前,你必须先使用ContainKey来核对键是否存在字典中。
spa
对一个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> 泛型接口,则默认比较器使用该实现。code
在这篇文章中,简要地介绍C#中的Dictionary<K,V>泛型字典的使用,经过它,你能够实现java和C++中Map集合类同样强大功能,经过本文的学习,你应该学会了Dictionary中如何添加键值、查找键值、删除元素等基本操做吧。
对象